named let tail 是递归的吗?
Is the named let tail recursive?
这两个例子计算一个数的阶乘:
(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。它们都是纯函数和尾递归函数吗?
是的,它们是尾递归的,它们本质上是等价的。
命名 let 只是一个 shorthand 函数定义以及使用初始值作为参数的第一次调用。
如果函数对自身的所有调用都在尾部位置,则该函数是尾递归的,即它只是 returns 该调用的值。在第一个函数中,对execute
的递归调用在尾部位置;在第二个函数中,对 loop
.
的调用也是如此
这两个例子计算一个数的阶乘:
(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。它们都是纯函数和尾递归函数吗?
是的,它们是尾递归的,它们本质上是等价的。
命名 let 只是一个 shorthand 函数定义以及使用初始值作为参数的第一次调用。
如果函数对自身的所有调用都在尾部位置,则该函数是尾递归的,即它只是 returns 该调用的值。在第一个函数中,对execute
的递归调用在尾部位置;在第二个函数中,对 loop
.