引子
设 m
、n
为正整数,
- 当乘积
mn
等于0
时,函数f(m, n)
等于m + n + 1
, - 否则
f(m, n)
等于f(m - 1, f(m, n - 1))
。
下面是上述问题的一段简单代码(Javascript
)
javascript
function f(m, n) { if (m * n == 0) { return m + n + 1 } return f(m - 1, f(m , n - 1)) } console.log(f(2, 1)) // 5
疑惑
摘自电子书ECMA6 入门中的 尾递归 的定义:
函数调用自身,称为递归。如果尾调用自身,就称为尾递归。
引子代码中的函数f
是return
了自身,但是其第二个参数又调用f
,那么在这种情况下,
- 函数
f
算不算是尾递归呢? - 如果
f
不是尾递归,又如何改成尾递归(如能改)?
不是尾递归。。
f(m , n - 1)
执行结束后需要向上层返回执行结果,也就是把结果给f(m - 1, f(m, n - 1))
然后继续递归。。那么程序运行时必然会保存f
函数上一层的状态,所以这跟普通递归一样的