Я реализовал эту рекурсивную функцию в схеме:
(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))))
)
Во многих упражнениях меня спрашивали, является ли мое решение хвостовой рекурсией или нет, и, честно говоря, независимо от того, сколько раз я читал определение хвостовой рекурсии, я просто не понимаю его. Если бы я определил хвостовую рекурсию, это было бы примерно так.
Определение: хвостовая рекурсивная функция вычисляется в постоянном пространстве памяти независимо от входного значения.
Вот еще два. Один из них хвостовой рекурсивный, и я хочу выяснить, какой именно.
(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