2

この質問を形成する最良の方法は、例を使用することだと思います...だから、私がこれについて質問することにした実際の理由は、Project Euler の問題 55のためです。この問題では、10,000 未満の Lychrel 数の数を見つけるよう求めています。命令型言語では、最後の回文に至るまでの数値のリストを取得し、それらの数値を関数外のリストにプッシュします。次に、着信する各番号をチェックして、それがそのリストの一部であるかどうかを確認し、そうである場合は、単にテストを停止して、その番号が Lychrel 番号ではないと結論付けます。非ライクリル番号とその前の番号についても同じことを行います。

私はこれを以前にやったことがありますが、うまくいきました。しかし、これを Haskell で実際に実装するのは、前任者を保持するための余分な引数の束と、格納する必要があるすべての数値を保持するための絶対親関数を関数に追加することなく、非常に面倒なようです。

ここに欠けているツールがあるかどうか、またはこれを行う方法として標準があるかどうか疑問に思っていますか? Haskell のような「自然にキャッシュ」を読んだことがあります (たとえば、奇数を として定義したい場合はodds = filter odd [1..]、必要なときにいつでもそれを参照できますが、動的に要素を追加する必要がある場合は複雑になるようですリスト。

これに取り組む方法について何か提案はありますか?

ありがとう。

PS: Project Euler の問題に対する答えを求めているわけではありません。Haskell についてもう少し詳しく知りたいだけです。

4

1 に答える 1

7

memoizingを探していると思います。これを行うにはいくつかの方法があります。かなり簡単な方法の 1 つは、MemoTrieパッケージを使用することです。または、入力ドメインが境界付きの数値セット ([0,10000) など) であることがわかっている場合は、値が計算の結果である配列を作成し、入力で配列にインデックスを付けることができます。ただし、入力数値が 10,000 未満であっても、後続の反復が自明に 10,000 を超える可能性があるため、配列アプローチは機能しません。

そうは言っても、私が Haskell で問題 55 を解決したとき、メモ化は一切しませんでした。すべての入力数値に対して (最大) 50 回の反復を実行するのに十分な速さであることが判明しました。実際、私のマシンで今実行すると、完了するまでに 0.2 秒かかります。

于 2012-06-04T19:23:02.557 に答える