質問

解決の問題があるか、必要な計算するためのバリアントのパスカルの三角定義されるようになります:

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)).一さ制限:f(n,k)は-1を返す>=2^32.

私の実施

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

の問題:のための非常に大きな数を取得しますスタックオーバーフロー.があるので、ウ力を評価する全体のリスト?もたらすのは明らかだと思います各ラインできないより多く含まれている要素は、上限なく-1しない保存および各ラインのみに依存しております。のぐさの評価本各線が計算で最後の行に必要で第二の要素のすべての幹に格納され...私は非常に効率的なc++でも思ったよりずっと思があれば取得できウです。

役に立ちましたか?

解決

作品は私にとって: 何ウステムに適用されているんですか?るナイーブプログラムの計算この三角形の色がほとんど無かったGHC6.10.4.私の印刷ができるのは1000行は、イブレア城、イブレア:

nextRow :: [Integer] -> [Integer]
nextRow row = 0 : [a + b + 1 | (a, b) <- zip row (tail row ++ [last row])]

tri = iterate nextRow [0]

main = putStrLn $ show $ tri !! 1000               -- print 1000th row

でも印刷、初めの10の数字列100000なくあふれるスタックです。お使いいただくことによってのはおかしいです。世界の名前 tri が、全体の三角形の結果できた場合でも、このように比較的無害化.

により順に評価: できる力thunksに対する評価は、"物事には順序があるので使用のプレリュード機能 seq (マジック機能できない実装面でウのその他の基本的な機能).場合をしないといけないと考えていウの印刷 a `seq` b, で評のサンク用 a, その評価-版画 b.

ご注意 seq 浅い:で のみ は十分な評価を a をなくすことにあり、サンク.の場合 a のタプル型の結果が残るタプルのthunks.の場合はリストの結果が連結実績細胞をthunksの頭と尾になります。

たものは大きかったんでしょうねないこのような単純な問題数千thunksなものための適切な実装されます。ってしまうようになります:

-- Evaluate a whole list of thunks before calculating `result`.
-- This returns `result`.
seqList :: [b] -> a -> a
seqList lst result = foldr seq result lst

-- Exactly the same as `nextRow`, but compute every element of `row`
-- before calculating any element of the next row.
nextRow' :: [Integer] -> [Integer]
nextRow' row = row `seqList` nextRow row

tri = iterate nextRow' [0]

の倍 seqList 基本的には拡大へ lst!!0 `seq` lst!!1 `seq` lst!!2 `seq` ... `seq` result.

この遅い私にとって印刷だけで、初めの10の要素列100,000.このような構造とすることが必要なことから、計算99,999完全列の三角形です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top