Recursion 递归函数导致的理论函数堆栈的最大深度?
如果我们有一个理论上永远不会满的堆栈内存,我们有一个简单的递归函数Recursion 递归函数导致的理论函数堆栈的最大深度?,recursion,data-structures,stack,Recursion,Data Structures,Stack,如果我们有一个理论上永远不会满的堆栈内存,我们有一个简单的递归函数 recurse(n): if n > 0: recurse(n-1) recurse(n-2) return 在执行recurse(n)时,理论堆栈在任何点上最多有n个堆栈帧,这是合理的,因为recurse(k)不可能位于recurse(i)之上,如果0很容易证明。自己画出来- recurse(0) 这就是为什么大型n的fib(n)不会溢出堆栈,而是会占用CPU很长时间。
recurse(n):
if n > 0:
recurse(n-1)
recurse(n-2)
return
在执行
recurse(n)
时,理论堆栈在任何点上最多有n个堆栈帧,这是合理的,因为recurse(k)
不可能位于recurse(i)
之上,如果0很容易证明。自己画出来-
recurse(0)
这就是为什么大型n
的fib(n)
不会溢出堆栈,而是会占用CPU很长时间。对于较小的n
,例如n=20
,结果以1048576步计算,但仅使用20帧-
函数fib(x)
{if(x<2n)
返回x
其他的
返回fib(x-1n)+fib(x-2n)
}
控制台日志(“结果%s”,fib(20n))
//结果6765
当函数调用本身有一个堆栈帧时-任何n
都不能少于一个堆栈帧-因此最大堆栈帧数的公式是max(1,n+1)
,而不是n
。否则你的推理是正确的,这个公式可以用归纳法证明:
- 在
n的基本情况下
recurse(1) recurse(0) recurse(-1)
recurse(2) recurse(1) recurse(0) recurse(-1) recurse(0)
recurse(3) recurse(2) recurse(1) recurse(0) recurse(-1) recurse(0) recurse(1) recurse(0) recurse(-1)
recurse(4) recurse(3) recurse(2) recurse(1) recurse(0) recurse(-1) recurse(0) recurse(1) recurse(0) recurse(-1) recurse(2) recurse(1) recurse(0) recurse(-1) recurse(0)