3

フィボナッチ数列のn番目の数を計算する関数の反復/末尾再帰バージョンを作成しようとしましたが、parse error (possibly incorrect indentation). なぜこうなった?私が使用しているコード:

fib n
    | n < 2 = n
    | otherwise = fibhelper 0 1 2 n
    where fibhelper a b curr num
          | curr == num = a + b
          | curr < num = fibhelper b (a+b) (curr+1) num

明確にするために、私はエラーを理解しようとしています-なぜそれが起こっているのか、どのように修正する必要があるのか​​ -効率的に実装しようとはしていません(たとえば、ここfibで人気のあるzipWith実装はすでに理解しています)。

ありがとう!

4

1 に答える 1

8

ガード部分は、関数名に対して少なくとも 1 文字インデントする必要があります。したがって、次のように機能します。

fib n
    | n < 2 = n
    | otherwise = fibhelper 0 1 2 n
    where fibhelper a b curr num
           | curr == num = a + b  -- moved one character to the left.
           | curr < num = fibhelper b (a+b) (curr+1) num
于 2010-12-15T15:52:10.727 に答える