考虑以下计算阶乘函数的实现:[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] 基于SICP http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html#%_sec_1.2.1 1.2.1节中factorial的迭代版本

最佳答案



使用 letrec 而不是 let

关于lambda - 为什么 `let` 不能用于命名内部递归过程?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3169444/

10-10 08:04