問題タブ [collatz]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 1に到達するのに必要なコラッツ予想のループ数に基づいて数を見つける
基本的に、1 に到達するのに 500 回の反復が必要な数を見つけるアルゴリズムを書きたいと思います。いくつかのバリエーションを試しましたが、うまくいきませんでした。
これまでの私のコードは次のとおりです。
編集:コードの更新バージョン
java - 高い値の collatz でのスタックオーバーフローを回避するには?
私は、最も長いコラッツチェーンを取得する必要があるオイラー問題に取り組んでいます。問題は、1 から 1 000 000 までのシーケンスでそれを見つけなければならないことですStackOverFlowError
。私はそれを避けることができますか、それとも私のコードはがらくたですか?
python - ネストされた while ループを使用したヘイルストーン シーケンス
ユーザーが数値の範囲を入力できるようにするプログラムを作成しています。プログラムは、範囲内の各数値の雹のシーケンスを実行し、サイクルの長さが最大の数値を出力します。ただし、コードが機能しない理由はわかりません。while ループを使用する必要があります
java - メモ化効率の問題 (Collatz Hailstone シーケンス)
私はここ数日間 (数学的な観点よりもアルゴリズム的な観点から)、与えられた数のヘイルストーン シーケンス (コラッツ予想) の長さを調査することに特に興味を持っていました。再帰アルゴリズムを実装することは、おそらく長さを計算する最も簡単な方法ですが、計算時間を不必要に浪費しているように思えました。多くのシーケンスが重複しています。たとえば、3 の Hailstone シーケンスを考えてみましょう:
3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1
これは長さ 7 です。より具体的には、1 に到達するのに 7 回の操作が必要です。次に 6 回かかる場合:
6 -> 3 -> ...
これはすでに計算済みであることがすぐにわかります。そのため、これらすべての数値を再度実行する代わりに、シーケンス長 3 を追加するだけで、各数値のシーケンス長を計算するために必要な操作の数が大幅に削減されます。
HashMap を使用して Java でこれを実装しようとしました (O(1) の確率的な get/put の複雑さを考えると適切なようです)。
基本的に行うことseqLen
は、指定された数値で開始し、その数値の Hailstone シーケンスを に既にある数値に遭遇するまで処理することcache
です。その場合、その数値を の現在の値に追加しcount
、値と関連するシーケンスをログに記録します。(key,val)
ペアとしての HashMap の長さ。
比較のために、次のかなり標準的な再帰アルゴリズムも用意しました。
ロギング アルゴリズムは、単純な再帰的方法よりもかなり高速に実行されるはずです。ただし、ほとんどの場合、それほど速くは実行されず、入力が大きい場合は実際には遅くなります。n
次のコードを実行すると、変更のサイズに応じて大幅に異なる時間が得られます。
n = 1,000
: 両方のアルゴリズムで ~2msn = 100,000
: 反復ロギングの場合は最大 65 ミリ秒、再帰的非ロギングの場合は最大 75 ミリ秒n = 1,000,000
: ~500ms および ~900msn = 10,000,000
: ~14,000ms および ~10,000ms
値を大きくするとメモリ エラーが発生するため、パターンが継続しているかどうかを確認できません。
私の質問は、n の値が大きい場合に、ロギング アルゴリズムが単純な再帰アルゴリズムよりも突然時間がかかり始めるのはなぜですか?
編集:
HashMap を完全に破棄し、単純な配列構造を選択すると (値が配列内にあるかどうかをチェックするオーバーヘッドの一部を削除するだけでなく)、目的の効率が得られます。
再帰アルゴリズムを使用すると 93 秒かかるのに対し、キャッシュ サイズ全体 (8000 万) の反復処理はわずか 3 秒で完了します。HashMap アルゴリズムはメモリ エラーをスローするため、比較することもできませんが、より低い値での動作を考えると、うまく比較できないと感じています。
javascript - 数値を配列にプッシュし、その配列を別の配列にプッシュする - JavaScript
ユーザー プロンプトとして 2 つの変数を使用するプログラムを作成しています。最初のものは開始番号で、次は範囲を決定する番号です。次にプログラムは、collatz 関数を使用して、入力された元の数値がゼロになるまでに必要なステップ数を出力し、この情報を画面に表示します。次に、開始番号を 1 増やし、開始番号が 2 番目に入力された番号に達するまでプロセスを繰り返す必要があります。
現在、これは元の開始番号である 1 つの番号に対してのみ機能しています。開始番号 (最初の入力) と範囲番号 (2 番目の入力) の間のすべての数値を実行するように collatz 関数をコーディングする方法がわかりません。私の推測では、何らかの for ループが必要で、値の配列をプッシュします。 (数値が 0 に達するまでにかかるステップ) 別の配列内の独自の配列として (プログラムが実行したすべての数値のすべてのステップを保持します)
誰かがこれを手伝ってくれるなら、本当に感謝します、ありがとう
list - パイソン 2.7。反復リストが機能しない
Python から始めて、いくつかの課題に取り組んでいます。これは Collatz 数に関するものです。ただし、collatz
メソッドに渡す範囲が指定された範囲を反復していない最初の段階で立ち往生しています。
ここで何が欠けていますか?