Рассмотрим следующую реализацию функции для вычисления факториала: [1]Почему не будет `позволять` работать для именования внутренних рекурсивных процедур?
(define fac-tail
(lambda (n)
(define fac-tail-helper
(lambda (n ac)
(if (= 0 n)
ac
(fac-tail-helper (- n 1) (* n ac)))))
(fac-tail-helper n 1)))
Я попытался переписать с помощью let
для внутреннего определения:
(define fac-tail-2
(lambda (n)
(let ((fac-tail-helper-2
(lambda (n ac)
(if (= 0 n)
ac
(fac-tail-helper-2 (- n 1) (* n ac))))))
(fac-tail-helper-2 n 1))))
Там нет ошибки в define
время, но результаты выполнения в:
#;> (fac-tail-2 4)
Error: undefined variable 'fac-tail-helper-2'.
{warning: printing of stack trace not supported}
Как я могу сделать let
версию работы?
Схема версия SISC v 1.16.6
[1] на основе итерационного версии factorial
в разделе 1.2.1 SICP http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html#%_sec_1.2.1
Полезно знать, что есть люди, взломавшие схему там ... :) – galambalazs