いくつかの問題を解決するには、次のように定義されたパスカルの三角形の変形を計算する必要があります。
f(1,1) = 1,
f(n,k) = f(n-1,k-1) + f(n-1,k) + 1 for 1 <= k < n,
f(n,0) = 0,
f(n,n) = 2*f(n-1,n-1) + 1.
与えられたnに対して、n番目の行(f(n、1).. f(n、n))を効率的に取得したいと思います。もう1つの制限:f(n、k)は、> = 2 ^ 32の場合、-1である必要があります。
私の実装:
next :: [Int64] -> [Int64]
next list@(x:_) = x+1 : takeWhile (/= -1) (nextRec list)
nextRec (a:rest@(b:_)) = boundAdd a b : nextRec rest
nextRec [a] = [boundAdd a a]
boundAdd x y
| x < 0 || y < 0 = -1
| x + y + 1 >= limit = -1
| otherwise = (x+y+1)
-- start shoud be [1]
fLine d start = until ((== d) . head) next start
問題:非常に大きな数の場合、スタックオーバーフローが発生します。haskellにリスト全体を評価させる方法はありますか?各行に上限を超える要素を含めることはできないことは明らかです。これらの要素は最終的に-1になり、格納されず、各行は前の行にのみ依存するためです。遅延評価のため、最後の行が2番目の要素を必要とし、途中のすべてのトランクが格納されるまで、各行の先頭のみが計算されます... c ++で非常に効率的な実装がありますが、 haskellでそれを成し遂げる方法も。