【问题标题】:Javascript recursive function within a loop循环内的Javascript递归函数
【发布时间】:2016-09-12 15:09:10
【问题描述】:

我似乎无法继续: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,但显然不是,因为堆栈错误。

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

【问题讨论】:

  • 你能保证通过不断加倍最终达到可整除的数字吗?
  • 我认为您希望将 2018940 添加 3 次,但每次都加倍,从 4037880 到 8075760。作为提示,我想我知道这个问题,我会推荐一种不同的方法。跨度>
  • 你的算法有缺陷。您是否正在寻找这个:stackoverflow.com/questions/147515/…

标签: javascript loops recursion


【解决方案1】:

19 永远不能区分2^n,其中n 是自然的,因为19 中唯一的主要因素是它自己,而2^n 中唯一的主要因素是2。这意味着当您原来的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,如您所愿。如何通过算法找到质因数应该很容易找到。

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

【讨论】:

    猜你喜欢
    • 2015-07-14
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2023-03-24
    • 2021-01-16
    相关资源
    最近更新 更多