2014-11-23 33 views
-2

听说递归功能强大等等而不是通过循环我试图创建,直到它达到一定的点,这增加了一些功能。当它达到我试图返回的价值,但它给undefined获取回报的JavaScript

CODE

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

console.log(rec()); 

这里i被递增,直到100,但它的极限后返回undefined。这是为什么发生?请让我知道,这种递归是好的然后for循环?

+6

'其他{返回REC(); ''? – vaultah 2014-11-23 12:05:16

+0

没有。在它变得> 100之后,我需要返回。直到我将调用函数来增加数字。只是为了练习递归。 – rram 2014-11-23 12:06:32

+1

@rram:**是**,vaultah是正确的。你为什么不试试呢?并通过调试程序执行代码? – 2014-11-23 12:08:06

回答

3

The comment通过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>


+0

感谢您的指导。 +1。请检查我的最新[小提琴](http://jsfiddle.net/wL035h8h/)。我有了递归的想法。但是为什么当我变成101并且只是返回101时它并没有停下来,而是返回undefined。 – rram 2014-11-23 12:35:21

+0

@rram:因为***再次***打印结果的调用不返回任何内容。如果你逐步了解代码,就会明白为什么上面是你如何做到这一点。 – 2014-11-23 12:40:10

+0

你一步一步通过代码是什么意思?现在我正在看Firebug控制台中的日志。这是一个更新的[小提琴](http://jsfiddle.net/wL035h8h/1/)。请检查我的评论 – rram 2014-11-23 12:48:10

-2

尝试把下面的代码的函数结束后:

typeof rec === 'undefined' 
0

那么你可以只使用return语句,你可以在控制台检查代码像

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

console.log(rec()); 
1

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

当你在这里把它叫做:

console.log(rec()); 

i1所以它会返回undefined

当返回值是超过100

您需要返回递归调用的结果,你永远不会做的返回值什么:

} else { 
    return rec(); 
} 

所以当它超过100,值被传递回堆栈。

它这种递归是好的然后循环?

号这是效率极其低下。

+0

感谢您的帮助解释,但我无法理解一点。这是我的疑问。我试图增加'i'变量,直到它变为> 100.这是101.所以如果那满足,那么我将返回'i',所以函数停止。所以没有更多的递归发生。返回的想法是停止递归。相反,为什么它最后给予未定义?这里是[修改过的代码的小提琴](http://jsfiddle.net/wL035h8h/)请咨询 – rram 2014-11-23 12:26:46

+0

@rram:再一次,在调试器中浏览代码(在浏览器中有一个代码)。第一次调用'rec'会增加'i',然后检查它。由于'2'不是'> 100',我们转到'else'。在'else'中,我们做'rec rec()',**调用'rec' **。第二次调用'rec'再次增加'i',看到'3'不是'> 100',并再次调用'rec'。这是递归算法的要点。最终,第99次对'rec'的调用会看到'i> 100'并返回'i',它允许第98次调用返回(并返回相同的值),从而允许第97次调用返回,依此类推。 – 2014-11-23 12:30:20

+0

感谢您的回答,并解释这是否比循环更好。 +1 – rram 2014-11-23 13:45:23