私は先週学校でフィボナッチ数列のn:番目の数を計算する関数を実装する任務を負いました。「サブ割り当て」は、関数O(n)の時間計算量を与えるために、累積(正しい変換ではない可能性があります)を使用して実装することでした。関数を作成しようとするまで(Int-> Integer)、これはすべて正常に機能しました。少し実験してみると、非常に大きな数の場合、時間計算量はO(n ^ 2)に近いことがわかりました。これは整数の実装が原因であるに違いないことに気づきました。これは、それがどのように機能するかについて少し興味をそそられます。私はいくつかのグーグル検索をしましたが、役に立つと思われるものは何も見つかりませんでした。それで、説明またはそれを完全に説明するリンクのいずれかを得ることを期待して皆さんに頼っています。
私のコード:
ackfib 0 = 0
ackfib 1 = 1
ackfib n = loop n 1 0 1
where
loop n n1 n2 i
| i < n = loop n (n1+n2) n1 (i+1)
| i == n = n1
| i > n = error "n must be greater than or equal to 0"
私はすべての答えに感謝しています
ヴィクトル