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

JavaScript递归函数调用中变量的最终值,javascript,recursion,Javascript,Recursion,递归函数的Else部分甚至会一直运行,直到num变为0。这很清楚,但是当console.log记录时,chrome开发者控制台显示num=1打印 最终值是0还是1 通话结束后的屏幕截图: 对于奇数,响应为假;对于偶数,响应为真。这看起来正是你需要的。但这看起来太复杂了,为什么不直接做呢 function even(num) {//console.log(num) => shows 1 & then 0 before terminating. if (

递归函数的Else部分甚至会一直运行,直到
num
变为0。这很清楚,但是当
console.log
记录时,chrome开发者控制台显示num=1打印

最终值是0还是1

通话结束后的屏幕截图:


对于奇数,响应为假;对于偶数,响应为真。这看起来正是你需要的。但这看起来太复杂了,为什么不直接做呢

    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.

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

因此:

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

    要看到这一点,请执行以下操作:

    函数偶数(num){
    log(“num是函数前面的“+num+”);
    如果(num==0){
    返回true;
    }否则{
    var returnValue=!偶数(num-1);
    log(“num是:“+num+”在递归之后”);
    返回值;
    }
    }
    
    控制台日志(偶数(5))是的,当我们使用像递归这样的数据结构时,所有调用都进入堆栈,所有操作都根据堆栈推送和弹出操作进行。所以

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


    堆栈中的1->0,但当您的条件为真时,堆栈将释放,因此它将返回原始状态,最后一个值为1,因此您将获得1。

    您的问题不清楚是什么问题以及您期望的输出。您在第二行有一个断点。继续code@JayHarris它之所以存在,是因为我正试图显示最终值
    num
    为1,而我期望它为10@AnkitAgarwal我正在尝试确定
    num
    的最终值,因此按play,它将再次中断。该函数将运行两次。你想第二次看到休息
    F8
    是continue Bt这当然更好,但我想知道为什么num的最终值在控制台中显示为1而不是0说
    num
    的最终值为1而不是0是正确的。这种行为有名称吗?按时间顺序:是的,num的最终值为1。我不确定具体的术语是什么,但这种行为是通过递归使用调用堆栈产生的。本页调用堆栈部分的图表更直观地解释了这一点:如果初始参数为2,那么最终值会是多少?是的,通过所有递归调用跟踪num将是2->1->0->1->2putting
    console.log(num)
    在函数体的开头,只记录1,然后记录0,然后返回false。我假设控制台中显示的最终值(num=1)不可访问?
    function even(num) {
        return n % 2 == 0;
    }