javascript递归返回错误值

标签 javascript recursion

我正在处理一个递归函数,它返回的值似乎比预期的错误。我能够复制它并将函数简化为:

function foo(i, target){    
    if(i < target){
        i++;
        foo(i, target);
    }

    return i;   
}
console.log(foo(0,5));

基本上,鉴于上面的函数,我希望返回值为 5。但是,它似乎返回 1。当我进行一些跟踪时,我注意到“return i”被调用了几次,每次它都得到减1?这种行为的原因是什么?我该如何解决?

最佳答案

您还需要从 if 返回加入您的代码。

function foo(i, target){    
    if(i < target){
        i++;
        return foo(i, target);
    }
   
    console.log(i);
    return i;   
}

console.log(foo(0,5));

为什么您的代码返回 1?

因为它只调用了 foo每次 i < target在它之后,您将按 5, 4, 3, 2, 1 顺序获得从嵌套调用返回的所有值最后一个从第一个函数调用返回的被打印出来。您可以通过输入简单的 console.log 来检查这一点在 return i 之前并与上述结果进行比较。

function foo(i, target){    
    if(i < target){
        i++;
        foo(i, target);
    }
   
    console.log(i);
    return i;   
}

console.log(foo(0,5));

可视化你可以看到的返回值

 console.log()                               console.log()
 |   Call with 1                             -- return Call with 1
 |   |   Call with 2                            -- return Call with 2
 |   |   |   Call with 3                           -- return Call with 3
 |   |   |   |   Call with 4                          -- return Call with 4
 |   |   |   |   |   Call with 5        VS               -- return Call with 5  
 |   |   |   |   |   return 5
 |   |   |   |   return 4
 |   |   |   return 3
 |   |   return 2
 |-- return 1

关于javascript递归返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47590418/

相关文章:

javascript - 在没有 webpack 或 browserify 的情况下使用带有 CDN 的 React Router

javascript - Require.js 加载 CDN bootstrap 和 CDN popper

javascript - 在 Javascript 的一次迭代中进行映射和排序?

java - 用并行流替换 for 循环 - Java

计算 C 中 k 的倍数的递归函数调用

java - 使用递归在 2 个索引之间的子字符串

c# - 如何 : "letrec" in C# (lambda expression call within its definition)

javascript - 切换元素 jquery

javascript - jQuery RadioButtonList 检查值返回 "on"

c - 根据我的理解,我编写了一些代码,因为我只是在不同的地方更改增量,但它与递归的答案不同