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)