Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: b2l в Nov 05, 2010, 10:32



Титла: Рекурсия в Scheme
Публикувано от: b2l в Nov 05, 2010, 10:32
Имаме следното:
Код
GeSHi (Scheme):
  1.  


Това трябва да пресмята сумата на целите числа от а до b. Гледаме 2-рия ред. Как го чета аз: Ако a > b (ако тука греша някой да ме поправи). И ако това е изпълнено следва израза да се оцени на 0. Ако не е изпълнено се изпълнява кода който е за else. Добре де, защо трябва a > b?
1 + 2 + 3 + 4 + 5 = 5 + 4 + 3 + 2 + 1...
Не разбирам за какво искаме a да е по-малко от b?


Титла: Re: Процедури като параметри в Scheme
Публикувано от: bop_bop_mara в Nov 05, 2010, 10:46
Ми щото явно така е зададено условието  ;D Иначе, може дъното на рекурсията да ти е когато двете числа са равни (оценява се като стойността им) и в else-клаузата да има пак if и според това кое е по-голямото да правиш рекурсивното извикване. Мързи ме да обяснявам днеска  ;D ;D ;D, схвана ли :)

ПС. Ааа, задачата сигурно е да се сумират всички цели числа в интервала [a,b] (a, b - цели), та затова a трябва да е по-малко (или равно според мен) от b.


Титла: Re: Процедури като параметри в Scheme
Публикувано от: lkr в Nov 05, 2010, 11:28
Ми щото явно така е зададено условието  ;D Иначе, може дъното на рекурсията да ти е когато двете числа са равни (оценява се като стойността им) и в else-клаузата да има пак if и според това кое е по-голямото да правиш рекурсивното извикване. Мързи ме да обяснявам днеска  ;D ;D ;D, схвана ли :)

ПС. Ааа, задачата сигурно е да се сумират всички цели числа в интервала [a,b] (a, b - цели), та затова a трябва да е по-малко (или равно според мен) от b.

Пълни глупости. Идеята е че всяка рекурсия трябва да има base case, когато приключва. В случая на всяко извикване 'a' се увеличава с 1, докато не стане по-голямо от 'b', тогава приключва рекурсията.

Код
GeSHi (Scheme):
  1.  

Вече ясно ли е какво става?


Титла: Re: Процедури като параметри в Scheme
Публикувано от: bop_bop_mara в Nov 05, 2010, 11:31
Ти май не разбра въпроса на backtolife - защо решението да не сумира и наобратно.
Иначе той си каза, че кодът му е ясно какво прави.


Титла: Re: Процедури като параметри в Scheme
Публикувано от: lkr в Nov 05, 2010, 11:33
Ти май не разбра въпроса на backtolife - защо решението да не сумира и наобратно.
Иначе той си каза, че кодът му е ясно какво прави.

Изобщо не му е ясно какво прави, също така тук няма никакви процедури като параметри. Въпросът доколкото виждам е защо искаме 'а' > 'b', даже е объркал като е написал: Не разбирам за какво искаме a да е по-малко от b? - трябва да е по-голямо, не по-малко


Титла: Re: Процедури като параметри в Scheme
Публикувано от: bop_bop_mara в Nov 05, 2010, 11:46
Мм
Не разбирам за какво искаме a да е по-малко от b?
според мен това пита :) (и да, пропуснал е, че всъщност a<=b)
Идеята му беше, че можем да сумираме числата от 1 до 5, но можем и да сумираме числата от 5 до 1, защо в кода, който са дали като решение е задължително да вървим от по-малкото до по-голямото, т.е защо да решението да не позволява (sum-int 5 1).
Условието не е изчистено като дефиниция, най-вече защото е някакво примерче. Не знам защо са решили да го озаглавят "процедури като параметри", но тъй като гледам какви са примерите, все за обикновена (пряка) рекурсия става въпрос.

ПС. Иначе, когато изрично сме казали, че не трябва първият аргумент да е по-голям от втория, в този код наистина дъното на рекурскията е при a>b, а не при a=b, защото иначе ще зацикли - (sum-int 5 1) = (+ 5 (sum-int 6 1)) =...


Титла: Re: Рекурсия в Scheme
Публикувано от: b2l в Nov 05, 2010, 14:10
За името на темата няма да споря. Просто така беше написана. Марчето знае защо съм я кръстил така и сте прави, че не трябва така да се казва.
Драги ми laker:

Код
GeSHi (Scheme):
  1.  
това кога се изпълнява? Когато 'a' > 'b'? Или и тука ще кажеш че пак не съм разбрал.