【问题标题】:Recursion in jQuery - NumerologyjQuery中的递归 - 命理
【发布时间】:2014-11-25 11:34:55
【问题描述】:

我正在尝试让递归函数在 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));
});

【问题讨论】:

  • 应该通过什么方式减少数量?现在唯一的减少方法是如果数字有三位数或更多,则获取前两位数。你这样做的奇怪方式表明实际上是有其他意图的。

标签: javascript jquery recursion


【解决方案1】:

因为你陷入了无限循环。你打电话给reduceNumber(12)。由于它与第一个if() 语句不匹配,因此转到第二个:

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

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

【讨论】:

    【解决方案2】:

    当你第一次调用 reduceNumber 并通过 12

    进入函数

    不小于 10,或等于 11 或 22 或 33

    其他的也是这样

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

    所以 newNumberToReduce 是 12

    再次调用reduceNumber函数传入12(再次)

    因此是无限循环

    【讨论】:

      【解决方案3】:

      改变这一行:

      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)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-26
        • 2014-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多