JavaScript递归函数调用中变量的最终值

时间:2018-03-30 04:46:00

标签: javascript recursion

    function even(num) {//console.log(num) => shows 1 & then 0 before terminating.
            if (num === 0) {
                return true;
            } else {
                return !even(num - 1);
            }
        }
    console.log(even(1));
//Why Chrome Console shows num = 1 when .log is being executed.

递归函数的Else部分甚至会在num变为0之前运行,这很清楚但是Chrome开发人员控制台在console.log正在记录时显示num = 1打印

最终值是0还是1?

调用完成后的屏幕截图:

enter image description here

3 个答案:

答案 0 :(得分:1)

对于奇数,响应将为false,对于偶数则为true。这看起来非常符合您的需求。但这看起来过于复杂,为什么不做呢

function even(num) {
    return n % 2 == 0;
}

答案 1 :(得分:1)

您提供的函数将递归调用自身,直到num为0,然后结果将重新冒泡。

所以:

  1. 偶数(1)被称为 - 当前函数:偶数(1)
  2. 偶数(0)由偶数(1)调用 - 当前函数:偶数(0)
  3. even(0)将true返回到even(1) - 当前函数:even(1)
  4. even(1)return!true:false - 当前函数:main,但是even(1)是最后一个被调用的函数。
  5. 最后,代码运行的最后一个版本的even()是偶数(1)。调试器将显示num = 1,因为这是返回前的最后一个值。

    要看到这一点:

    function even(num) {
      console.log( "num is: " + num + " before function" );
      if (num === 0) {
        return true;
      } else {
        var returnValue = !even(num - 1);
        console.log( "num is: " + num + " after recursion" );
        return returnValue;
      }
    }
    console.log(even(5));

答案 2 :(得分:1)

是的,当我们使用像递归那样的数据结构时,chrome显示正确然后在这里发生了所有调用堆栈和所有操作根据堆栈推送和弹出操作发生的情况。所以

当你将1传递给函数时,基本上发生的是num的值是 -

1 - >堆栈中为0,但是当你的条件为真时,堆栈正在释放,所以它将恢复原始状态,最后一个值为1,这样你就得到了1。