【问题标题】:Call stack for call trees调用树的调用栈
【发布时间】:2021-02-07 16:20:36
【问题描述】:

我对递归函数如何使用内存创建“调用堆栈”有一个粗略的想法,但我对这个概念有疑问。让我们假设我们有一个像 factorial() 这样的函数,它在每个递归步骤中调用自己一次。另一方面,有作为斐波那契数字生成器的功能,每一步调用自己两次。假设两个函数的递归调用总数相同,那么斐波那契函数会比阶乘函数使用更多的内存吗?

【问题讨论】:

    标签: recursion memory memory-management


    【解决方案1】:

    最初,对于堆栈(如下图)所示的阶乘,首先值为5,然后是4,然后是3到1,每次调用都占用一个内存堆栈中的阶乘函数,取决于递归树的高度。它应该是 5 个内存单元,最后,如果它的输入是 n,空间复杂度是 n 的顺序。返回值1后,函数返回,变量在栈中一一消失。事实上,上升趋势(修正每个函数调用中的变量)和下降趋势(当我们完成每个函数的工作时)。

    但是对于斐波那契,首先,值是5,斐波那契函数用值4和3调用,它首先进入斐波那契3(左分支)。因为首先必须计算它,然后转到 Fib 4。在堆栈中(我没有画它)我们有两个值。然后 4 的 fib 变成 3 的 fib 加上 2 的 fib。首先,计算 3 的 fib,然后计算 2 的 fib。到目前为止,我们已经在内存中存储了 3 个变量(5,4,3)。同理,我做的编号消耗多达 5 个内存单位(5,4,3,2,1,它是树的最高高度)。所以对于n作为输入,空间复杂度是n的阶。所以他们是平等的。

    图片: enter image description here

    【讨论】:

      猜你喜欢
      • 2011-11-01
      • 2020-10-25
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 2011-04-17
      相关资源
      最近更新 更多