循环中的Javascript递归函数

时间:2016-09-12 15:09:10

标签: javascript loops recursion

我似乎无法继续:RangeError: Maximum call stack size exceeded错误。我试图找到一个可以被一个范围内的所有数字整除的最小数字。该范围内的数字作为数组传递给函数。

function smallestNumberEvenlyDivisible(smallest, numbers) {
    var z = 0;

    for (z; z < numbers.length; z++) {
        if (smallest % numbers[z] !== 0) {
            smallest += smallest;
            return smallestNumberEvenlyDivisible(smallest, numbers);
        }
    }

    return smallest;
}

smallestNumberEvenlyDivisible(2018940, [18, 19, 20, 21, 22, 23]);

我希望输出为:6056820但显然不是,因为堆栈错误。

几乎没有想法。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

19永远不能2^n n 19是自然的,因为2^n中唯一的主要因素是其本身,唯一的2是{{} 1}}。这意味着,当您的原始smallest无法被19整除时,您会产生无休止的递归。

我有一段时间没有做这些事情并且不确定是否有更快的方法,但最小的应该是包含所有数字的所有素数因子的最小集合的乘法。

在示例中,

  • 18 = 2 * 3 * 3
  • 19 = 19
  • 20 = 2 * 2 * 5
  • 21 = 3 * 7
  • 22 = 2 * 11
  • 23 = 23

所有数字将分开的最小数字:2 * 2 * 3 * 3 * 5 * 7 * 11 * 19 * 23 = 6056820如您所料。如何在算法上找到素数因子应该很容易找到。

再次注意,可能有更快的方法,也许您打算在没有错误的情况下实施?