【问题标题】:How does recursion works behind the scenes of the Call Stack? [duplicate]递归如何在调用堆栈的幕后工作? [复制]
【发布时间】:2016-12-21 04:03:47
【问题描述】:

我理解递归的逻辑,一个函数调用一个带有基本情况的函数然后终止,我这里有一个记录简单递归的代码,我没有得到它是在达到条件时开始记录,条件满足: 0?

function factorialize(num) {

    if(num === 0){
        console.log('condition met: '+num);
        return 1;
    }

    var x = factorialize(num-1); // iterate
    var toReturn = num*x;

    console.log("Current call: num = " + num
            + " x = " + x
            + "\n"
            + "Returning " + toReturn
            );

    return toReturn;

}

factorialize(5);

我希望这段代码首先记录输出,最后达到条件?

输出和demo

【问题讨论】:

  • 要了解递归,首先要了解递归 咯咯笑
  • 为什么先记录基本情况? @vaxquis
  • 因为factorialize(5)调用factorialize(4),它调用factorialize(3),它调用factorialize(2),它调用factorialize(1),它调用factorialize(0)
  • 您应该能够在纸上“执行”此代码以了解其工作原理。执行首先命中 console.log
  • @vaxquis 知道了,有没有办法可以在调试器上查看调用堆栈或如何记录它们?

标签: recursion


【解决方案1】:

在递归中,先“入”,然后“出”。

递归factorialize 调用之前的任何东西都在“进入”的路上。

它之后的任何东西都在“出去”的路上。

由于您的第二个 console.log 语句出现在递归调用之后,因此它在“退出”的路上执行。

您的第一个console.log 语句位于if 语句中。 if 语句出现在递归调用之前,因此它在“进入”途中的每一层都进行了测试,但它仅在到达井的 bottom 时才执行 console.log 语句.

【讨论】:

    【解决方案2】:

    作为already pointed out,是

    因为factorialize(5)调用factorialize(4),调用factorialize(3),调用factorialize(2),调用factorialize(1),调用factorialize(0)

    然后所有的日志都出现了。

    【讨论】:

    • 您能否详细说明调用堆栈?我对我的输出感到困惑,在最底部,它记录返回 120。所以它返回 120,但为什么在日志的第一行满足条件?
    • 代码启动时第一次进入函数。检查你的 if 哪个返回 false 并暂停函数的执行以第二次进入它......等等,直到最后一次调用打印你的“条件满足”并且它结束函数并从最后一个函数调用继续完成它,所以它打印下一个日志,并再次继续上一个函数调用并再次打印,直到执行终止
    • @vaxquis 感谢您的编辑
    • @Yitschak n/p,伙计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2015-08-17
    • 2017-01-18
    • 2014-02-14
    • 1970-01-01
    • 2017-12-16
    相关资源
    最近更新 更多