私はハスケルを学び始めています。新しい言語を学んでいるときに好きなことの1つは、私の主な参考資料の補足として、Project Eulerの問題です。ハスケルはこの膨大な数を即座にどのように計算しますか?
私もフィボナッチ数未満400万の合計見つけるの第二の問題点を次のように解決策が出ている:
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
f :: Integer -> Integer
f n =
let evenFib = filter (\n -> n `mod` 2 == 0) fibs
in sum (takeWhile (<n) evenFib)
これは素晴らしい作品を、 f 4000000
は正しい答えを返します。それはすぐにそうする。不思議なことに、私はもっと大きな数字を入力し始めました...
Prelude> f 40000000
19544084
Prelude> f 400000000000
478361013020
Prelude> f 40000000000000000000000000000000
13049874051046942401006156573274
Prelude> f 2370498572349582734598273495872349587234958723948752394857
2805750129675962215536656398462489370528480907433875715844
これらの値はそれぞれ直ちに返されます。私は最後の2つの答えの真実性を保証する方法がありません。なぜなら、私の他の言語での実装はこのような大きな数値に対しては機能しないからです。
私の質問は、ハスケルはここで何をしていますか?これらの値を瞬時に返す方法(実際に正しいかどうか)さらに、これらの答えは確かに正しいですか、またはハスケルはちょうどものを作っていますか?
(1)整数は、任意の精度整数型です。おそらく、使用している他の言語に相当するものがあります。 (2)3つのヒント:(a)それは本当に瞬間ですか? (b)フィボナッチ数はどのくらい速くなりますか? (c)各ケースで実際に合計している値の数はいくつですか? – duplode
アルゴリズムの複雑さはO(log(n))です。それがとても速い理由です。 – ZhekaKozlov