Приложих тази рекурсивна функция в схема:
(define f (lambda (n)
(cond ((= n 0) 0)
((= n 1) 2)
((= n 2) 37)
((odd? n) (+ (f (- n 3)) 1))
(else (+ (f (- (/ n 2) 1)) 7))))
)
При много упражнения ме питаха дали решението ми е рекурсивна опашка или не и честно казано, колкото и пъти да чета дефиницията за рекурсия на опашката, просто не я разбирам. Ако дефинирам tail-recursive, ще бъде нещо подобно.
Определение: Реверсивна функция с опашка се изчислява в постоянно пространство на паметта, независимо от входната стойност.
Ето и още две. Един от тях е tail-recursive и искам да разбера кой.
(define ln2-a
(lambda (n)
(define loop
(lambda (n)
(if (= n 1)
0
(+ 1 (loop (quotient n 2))))))
(trace loop)
(loop n)))
И тук.
(define ln2-b
(lambda (n)
(define loop
(lambda (n result)
(if (= n 1)
result
(loop (quotient n 2) (+ result 1)))))
(trace loop)
(loop n 0)))
Нека да разгледаме последните две функции. Тук предполагам, че ln2-b е рекурсивният. Но не мога да отговоря точно защо, което ме дразни. Мисля, че цикълът за проследяване ми помага, НО не съм съвсем сигурен какво казва и как ми помага. Опитвам се да сравня и трите функции, да намеря прилики, но и как се различават една от друга. Но за съжаление не мога да го направя...
Надявам се някой приятел да ми помогне, благодаря. О, аз също съм наистина нов в компютърните науки, така че може би използвам грешна терминология. Ако нещо не е ясно, просто го кажете. :)
ln2-b
е tr, тъй като цялата работа е свършена преди рекурсията. Сln-2a
,loop
се извиква рекурсивно и при връщане от цикъл, 1 се добавя към резултата. - person Johnny Mopp   schedule 14.09.2015