命名为let tail是递归的吗?

时间:2018-02-02 16:35:08

标签: scheme tail-recursion let

这两个例子做了一个数字的阶乘:

(define (factorial n)
  (define (execute n result)
    (cond
         [(> 2 n) result]
         [else (execute (- n 1) (* result n))]))
  (execute n 1))

(define (factorial n)
  (let loop ((curr n)
             (result 1))
    (cond
         [(> 2 curr) result]
         [else (loop (- curr 1) (* result curr))])))

区别在于使用named-let。它们都是纯粹的和尾递归函数吗?

1 个答案:

答案 0 :(得分:2)

是的,它们是尾递归的,它们基本上是等价的。

命名let只是函数定义的简写,以及使用初始值作为参数的第一次调用。

如果函数对其自身的所有调用都处于尾部位置,则它是尾递归的,即它只返回该调用的值。在第一个函数中,对execute的递归调用处于尾部位置;在第二个函数中,对loop的调用也是如此。