2016-09-12 18 views
0

RangeError: Maximum call stack size exceededエラーから移動できないようです。ある範囲内のすべての数値で割り切れる最小の数を見つけようとしています。その範囲の数値は配列として関数に渡されます。 6056820しかし、明らかではない、なぜならスタックエラーの:ループ内の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]); 

私は、出力があることを期待しています。

かなり多くのアイデアがありませんでした。何か提案してください? 19で唯一の素因数は、それ自体で一つだけが2^n2であるため、nは自然です

+2

あなたは最終的に倍数を割り振ることで、割り切れる数を打つことが保証されていますか? – StephenTG

+1

私はあなたが2018940を3回追加することを期待していると思いますが、代わりに4037880から8075760まで毎回倍増しています。ヒントとして、私はこの問題を知っていると思います。 –

+0

あなたのアルゴリズムに欠陥があります。あなたはこれを探していますか:http://stackoverflow.com/questions/147515/least-common-multiple-for-3-or-more-numbers? –

答えて

1

192^nをdevideことはできません。これは、元のsmallest19で割り切れない場合、無限の再帰を生成したことを意味します。

私はしばらくこのようなことをしていませんでしたが、より高速な方法があるかどうかは不明ですが、最小値はすべての数値のすべての素因数を含む最小集合の乗算でなければなりません。

例で

  • 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アルゴリズム的に素因数を見つける方法は簡単に見つけることができます。

あなたが行ったエラーなしに実装しようと思っていたより速い方法があるかもしれないことに注意してください。