【问题标题】:js recursion function output question, function stackjs递归函数输出题,函数栈
【发布时间】:2021-09-28 13:06:28
【问题描述】:

我对函数递归感到困惑

function foo(i) {
  console.log("checking: " + i);
  if (i < 0)
    return;
  console.log('begin: ' + i);
  foo(i - 1);
  console.log('end: ' + i);
}
foo(1);

为什么是输出:

checking: 1
begin: 1
checking: 0
begin: 0
checking: -1
end: 0
end: 1

它不应该打印 end: 0, end: 1,因为我们在 if 条件下返回。发生了什么?

【问题讨论】:

    标签: javascript function recursion


    【解决方案1】:

    return 只终止最立即运行的函数。

    foo(1)
      foo(0)
        foo(-1)
    

    if (i < 0)
      return;
    

    在第三次调用时完成,终止第三个函数

    foo(1)
      foo(0)
        foo(-1) <-- this function stops running
    

    但让其他功能照常继续:

    foo(1)
      foo(0) (execution resumes here, just after the foo(1) line)
    

    可以通过抛出错误退出所有祖先函数(直到.catch,如果有的话),但这种仅仅为了控制流的策略并不是好主意。

    function foo(i) {
      console.log("checking: " + i);
      if (i < 0)
        throw new Error();
      console.log('begin: ' + i);
      foo(i - 1);
      console.log('end: ' + i);
    }
    foo(1);

    【讨论】:

    • 嗨@CertainPerformance,如果我们在函数内的任何地方使用返回键,它应该会正确地输出函数,那么为什么解释器会出现 console.log('end: ' +i); 线。如果我错了,请纠正我。谢谢
    • 它只停止最直接的调用,而不是函数的所有调用。
    • @RabindraKumarMahato current 正在运行的函数被终止。正如答案所述,有 三个 不同的函数调用。第三个完成了,另外两个还在运行中。
    • @RabindraKumarMahato 因为return 仅在当前函数中给出结果后完成。返回后似乎所有功能都完成了。递归很难我也这么认为!
    猜你喜欢
    • 2012-07-26
    • 2017-10-20
    • 2017-06-18
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    相关资源
    最近更新 更多