2011-01-22 5 views
5

私はHaskellのプログラミング初心者で一般的なプログラミングですが、問題解決が好きなのでProject Eulerの問題を解決しようとしています。しかし、私はproblem #12に問題があります。ハスケルのProject Euler#12に対する私の解決策の問題を見つけるのを助けてください。

私はうまくいくと思っていた解決方法を考案しましたが、悲しいかな、それはありません。

私のコードで問題に私の目を開けて、 と私を助けることができますそれを修正するための正しい方向にプッシュ?ありがとうございました。ここで

はコードです:

triangleNumber = scanl1 (+) [1..] 

factors n = [x | x <- [1..n], n `mod` x == 0] 

numFactors = length . factors 

eulerTwelve = find ((>500) . numFactors) triangleNumber 

はどうもありがとうございました! :)

+0

私によく見えます。あなたが持っている特定の問題は何ですか? – luqui

+0

その動きは信じられないほどゆっくり –

+1

プロジェクトのオイラーについては、ブルートフォースを使ってほとんどの問題を解決できるか、またはブルートフォースを避けるために巧みな方法でインテリジェントに行うことができます。あなたのコードが遅い場合は、強引なアプローチを使用していますか?ブルートフォースコードを書く前に問題について考えてみてください。 PE 12の場合、合理的な方法でこれを行うと、これは扱うことができます。 (それはほとんどの小数点以下のPE問題にも当てはまります)。しかし、その解決策を改善する方法があります。 1からnまでの数字の合計が何であるか考えてみてください。 –

答えて

2

私はそれをコピーし、私が投げたものは見つからないというエラーでした。これは、findが入っているモジュールListをインポートする必要があるからです。

import Data.List 

ちなみに、ファクタ機能を最適化する必要があります。

+0

ファクタの最適化について:後のPEの問題のいくつかを解決するには、一般的なタスクを解決するための関数のツールボックスを構築することが重要です。整数の因数分解はこれらの事の一つであるが、あなたがゆっくりと問題を処理するときには、これ以上のものがあることが分かるだろう。だから、始めるときには、単純な解決法を使用しますが、後でそれをさらに最適化することに留意してください。 –

+0

ええ、私はData.Listをインポートしましたが、投稿にそれを含めるのを忘れてしまったのですが、私が経験していた問題は明白なエラーではなく、コンピュータの応答が遅いというのでした。 –

+0

私はそれを最適化しようとしますが、それを遅くするファクタ関数かもしれません。 –

1

あなたが言いたい問題は、eulerTwelveが終了するには時間がかかりすぎるということです。あなたのコードは正しいです、それはちょうど非効率です。ボトルネックはfactors関数です。これは1からnの間のすべての数値を、除算値がnかどうかを調べることです。ここでefficient prime factorizationa nifty implementation of the power setを使用して、数の約数を見つけるためのより高速な方法があります:

import Data.Numbers.Primes (primeFactors) 

powerSet = filterM (const [True, False]) 

factors = map product . nub . powerSet . primeFactors 

これでもかなり非効率的です。あなたの代わりにそのようなprimeFactorsから直接numFactorsを計算することができます。

numFactors = product . map ((+1) . length) . group . primeFactors 

私はこの1つを使用してnumFactorsを交換するとき、私は即座に結果を得ます。

0

IIRCの場合、1からnまでのすべての整数をテストする必要はありません.1からn^0.5までの数(nの平方根)のみが必要です。利用可能です。

+0

それらの半分(およそ)と素因数分解はとにかく効率的です。 – adamax

3

Project Eulerの質問は、明快な検索をプログラミングして実行するだけで解決するのは悪い考えです。 (以前の質問のいくつかはそのように解決することができますが、それを悪用するのではなく、それらを練習として使用することをお勧めします)。代わりに、コンピュータの検索を行うために質問の数学的な内容について考える必要があります扱いやすい。

私が離れすぎを与えたいと思うが、ここではいくつかのヒントですありません。三角数番目のnための式があります

  • 。それを見つけるので、合計で計算する必要はありません。

  • nの三角形の数式では、どのような数がその除数になる可能性がありますか?

  • これらの約数について知っているとすれば、そこに何人がいるのか把握する簡単な方法は何ですか?(それらを列挙することなしに)

+0

閉じた形の_n番目の三角形の数字は知っておきましょうが、正しい三角形の番号を見つけるまで、すべての三角形の番号を順番に調べなければならないので、これをより効率的にすることはできません。実際、私は 'scanl1(+)'メソッドがこの事実を考えるとやや効率的だと思います。 –

+0

@pelotom:すべての三角形の数を計算しなければならない場合は、繰り返される合計が最良の方法であることに同意します。しかし、どのような*三角形の数を計算しなければならないと思いますか? (あなたが答えに必要なものとは別に) –

+0

@Gareth:公正なポイント、私はその仮定をしています。あなたは、順番に各三角形の数を調べる必要はありませんソリューションがありますか? –

関連する問題