2014-11-25 91 views
1

我试图让一个递归函数在jQuery的工作,但我得到以下异常:递归jQuery中 - 命理

“未捕获的RangeError:最大调用堆栈大小超出”

我的理解是递归函数必须以某种方式无限运行,但我无法弄清楚为什么会发生这种情况。谢谢...

jQuery.fn.reduceNumber = function(numberToReduce) { 
if (numberToReduce < 10 || numberToReduce == 11 || numberToReduce == 22 || numberToReduce == 33){ 
    return numberToReduce; 
} else { 
    var newNumberToReduce = numberToReduce.toString().substring(0,1) + numberToReduce.toString().substring(1,2); 
    return ($(this).reduceNumber(newNumberToReduce)); 
} 
} 

$(document).ready(function(){ 
    $("#foo").html($(this).reduceNumber(12)); 
}); 
+0

以何种方式减少数量?现在唯一减少的方法是获取前两位数字,如果数字有三位数或更多。你这样做的奇怪的方式表明其他东西实际上是有意的。 – Guffa 2014-11-25 11:41:20

回答

0

因为你陷入了无限循环。您正在致电reduceNumber(12)。因为它不符合第一if()声明,它进入第二:

var newNumberToReduce = numberToReduce.toString().substring(0,1) + numberToReduce.toString().substring(1,2); 

领导newNumberToReduce是.... 12!然后调用reduceNumber(12),它一次又一次地做同样的事情,直到超过最大堆栈大小。

0

当你调用reduceNumber首次通过12

它去功能

这是不小于10或等于11或22或33

如此做别的

的newNumberToReduce是的第一个字符12(1)和12的第二个字符(2)

所以newNumberToReduce是12

调用reduceNumber函数再次通过在12(再次)

因此infinte环

0

变化这一行:

var newNumberToReduce = numberToReduce.toString().substring(0,1) + numberToReduce.toString().substring(1,2); 

这样:

var newNumberToReduce = (numberToReduce.toString().substring(0,1) | 0) + (numberToReduce.toString().substring(1,2) | 0); 

,将创建一个新的数字(1 + 2 = 3)