【问题标题】:Getting return undefined on recursive function javascript在递归函数javascript上获取未定义的返回
【发布时间】:2014-11-23 12:04:33
【问题描述】:

我听说递归函数很强大,所以我尝试创建一个函数来增加一个数字,直到它达到某些点,而不是通过循环。当它到达时我试图返回值,但它给了undefined

代码

var i=1;
function rec(){
    i++;
    console.log(i);
    if(i > 100){
        return i;
    }else{
        rec();
    }
}

console.log(rec());

这里i 递增到 100。但在限制之后返回 undefined。为什么会这样?也请告诉我,这种递归是不是很好然后for循环?

【问题讨论】:

  • else { return rec(); } ?
  • 没有。在它变成 > 100 后,我需要返回。直到我将调用该函数来增加数字。只是为了练习递归。
  • @rram:是的,金库是对的。你为什么不试试呢?并使用调试器单步执行代码?
  • 该死!现在我知道那是什么感觉了..

标签: javascript recursion


【解决方案1】:

The comment by vaultah 是正确的:

var i=1;
function rec(){
    i++;
    console.log(i);
    if(i > 100){
        return i;
    }else{
        return rec();
    }
}

snippet.log(rec());
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

让我们举个例子,只计算到 &gt; 5 并添加一些输出,以便您可以更轻松地查看发生了什么(但同样,使用调试器单步执行代码是了解其工作原理的正确方法):

var indent = "";
var i=1;
function rec(){
    var rv;
    i++;
    indent += "&nbsp;";
    if(i > 5){
      snippet.logHTML("<p>" + indent + i + " > 5, returning " + i + "</p>");
        rv = i;
    }else{
        snippet.logHTML("<p>" + indent + i + " is not > 5, calling rec</p>");
        rv = rec();
        snippet.logHTML("<p>" + indent + "Got " + rv + " back from rec, returning it</p>");
    }
    indent = indent.substring(0, indent.length - 6);
    return rv;
}

snippet.logHTML("<p>Final result: " + rec() + "</p>");
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

【讨论】:

  • 感谢您的指导。 +1。请查看我最新的fiddle。我想到了递归。但是为什么当我变成 101 并返回 101 时它没有停止。相反,它返回未定义。
  • @rram:因为 again 您正在打印结果的调用不会返回任何内容。如果您单步执行代码,就会很明显为什么上面是您这样做的原因。
  • 逐步执行代码是什么意思?现在我在萤火虫控制台中看到日志。这是另一个更新的fiddle。也请查看我的评论
  • @rram:调试器可以让您停止代码,然后一次执行每一行,同时查看变量等。这就是所谓的“在调试器中单步执行代码”。同时,参见上面的第二个 sn-p。
  • 对不起,现在更困惑了。为什么我们在 else 部分得到 Got 6 back from rec, returning it 4 次
【解决方案2】:

rec 将返回 i(如果 i 超过 100)或 undefined(否则)。

当你在这里调用它时:

console.log(rec());

i 将是 1,因此它将返回 undefined

当返回值超过 100 时,你永远不会对返回值做任何事情。

需要返回递归调用的结果:

} else {
    return rec();
}

所以当它超过 100 时,该值会传回堆栈。

这样的递归对for循环好吗?

没有。这是非常低效的。

【讨论】:

  • 感谢您的帮助解释,但我有点听不懂。这是我的疑问。我正在尝试增加i 变量,直到它变为> 100。即101。所以如果满足,那么我将返回i,因此函数停止。所以不再发生递归。 return 的想法是停止递归。相反,为什么它最后给出了未定义的?这里是fiddle of modified code请指教
  • @rram:再次,在调试器中单步调试代码(浏览器中内置了一个)。第一次调用rec 将增加i 然后检查它。由于2 不是&gt; 100,我们转到else。在else 中,我们执行return rec(),它调用rec。第二次调用rec 再次增加i,发现3 不是&gt; 100,并再次调用rec。这是递归算法的重点。最终,对rec 的第 99 次调用看到 i &gt; 100 并返回 i,这允许第 98 次调用返回(并且返回相同的值),从而允许第 97 次调用返回,依此类推。
  • 感谢您的回答,并解释了这是否比 for 循环更好。 +1
【解决方案3】:

你可以只使用 return 语句,你可以在控制台中检查代码,如

var i=1;
function rec(){
i++;
console.log(i);
if(i > 100){
    return i;
}else{
    return rec();
}
}

console.log(rec());

【讨论】:

    【解决方案4】:

    尝试在函数结束后添加以下代码:

    typeof rec === 'undefined'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      相关资源
      最近更新 更多