在递归函数javascript上获取返回未定义

时间:2014-11-23 12:04:33

标签: javascript recursion

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

CODE

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

console.log(rec());

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

4 个答案:

答案 0 :(得分:3)

The comment之前的{p> 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>


让我们举个例子,只计算> 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 :(得分:1)

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

当你在这里打电话时:

console.log(rec());

i将为1,因此会返回undefined

当返回值超过100时,您永远不会对返回值执行任何操作。

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

} else {
    return rec();
}

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

  

这种递归对于循环来说是好的吗?

没有。这是非常低效的。

答案 2 :(得分:0)

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

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

console.log(rec());

答案 3 :(得分:-2)

尝试在函数结束后输入以下代码:

typeof rec === 'undefined'