我听说递归函数是强大的,所以反过来循环我尝试创建一个函数,增加一个数字,直到它达到某些点。当它到达时我试图返回该值,但它给出了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
循环好吗?
答案 0 :(得分:3)
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 += " ";
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'