在C Primer Plus(第6版)中,它 以这种方式定义尾递归概念:
在最简单的递归形式中,递归调用位于函数的末尾,就在return语句之前.这称为尾递归或结束递归,因为递归调用最后会发生.尾递归是最简单的形式,因为它就像一个循环.
它给出了以尾递归方式计算阶乘的示例:
long rfact(int n) { long ans; if (n > 0) ans = n * rfact(n - 1); else ans = 1; return ans; }
它也是一个侧面说明,在我看来这是不正确的:
请注意,虽然对rfact()的递归调用不是函数中的最后一行,但它是n> 0时执行的最后一个语句,因此它是尾递归.
可以清楚地看到,最后一个语句是n * rfact(n - 1)
,如果递归扩展,它将导致一系列延迟乘法.该过程在本质上是递归的,从而所描述的实现不能尾递归这里.
这个例子具有误导性.你有什么意见?