2016-09-12 4 views
0

Кажется, что я не могу перейти от: RangeError: Maximum call stack size exceeded ошибки. Я пытаюсь найти наименьшее число, которое равномерно делится на все числа в пределах диапазона. Числа в этом диапазоне передаются функции как массив.Рекурсивная функция Javascript в цикле

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 но, очевидно, не из-за ошибки стека.

В значительной степени кончились идеи. Любые предложения, пожалуйста?

+2

Гарантировано ли, что вы в конечном итоге ударите делимое число, непрерывно удваивая? – StephenTG

+1

Я думаю, вы ожидаете добавить 2018940 3 раза, но вместо этого он удваивается каждый раз, от 4037880 до 8075760. В качестве подсказки я думаю, что знаю эту проблему, и я бы порекомендовал другой подход. –

+0

Ваш алгоритм ошибочен. Возможно, вы ищете это: http://stackoverflow.com/questions/147515/least-common-multiple-for-3-or-more-numbers? –

ответ

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, как вы ожидали. Как легко найти алгоритмы поиска простых факторов.

Заметим еще раз, что существуют более быстрые методы, возможно, то, что вы намеревались реализовать без сделанной вами ошибки?

Смежные вопросы