0

パスカル三角形の作成で問題に直面しています。コードを以下に示します。ここで、 sumLstEltsは行の要素を合計し、putBetweenは合計を [1] の右側に配置します。pascal nは一連の一連のパスカル シーケンスを連続して表示します。

    sumLstElts (x:[])=[x]
    sumLstElts []=[]
    sumLstElts xs=[head xs+head(tail xs)]++sumLstElts (tail xs)

    putBetween xs'= [1]++xs''
            where xs''=sumLstElts xs'

    pascal 0=[1]
    pascal n= putBetween(pascal (n-1)) ++ pascal(n-1)

私のエラーを特定するのを手伝ってくれませんか?事前にt​​hnx。

さがた

4

1 に答える 1

1

n 番目の行だけが必要な場合は、

pascal n= putBetween(pascal (n-1))

は正しい方法でありputBetween、与えられたから完全な次の行をすでに構築しています。三角形を行のリストとして作成する場合は、次のようになります

pascal :: Int -> [[Integer]]
pascal n = take (n+1) $ iterate putBetween [1]

行 0 から始まる三角形を作成します。三角形の一部を逆の順序で並べたい場合は、長い行を最初に、

pascal :: Int -> [[Integer]]
pascal 0 = [[1]]
pascal n = putBetween top : previous
  where
    previous = pascal (n-1)
    top = head previous

それをします。

あなたの試みの問題は、 -st 行だけでなく前の行も含むことを意図したputBetweenの結果全体に適用されることです。したがって、最初の行とゼロ番目の の連結が与えられ、それに適用される場合、それはパスカルの三角形の行ではないため、結果も 1 ではありません。行の連結を取得することもできますpascal (n-1)n-1pascal 1[1,1][1]pascal 2putBetween

pascal 0 = [1]
pascal n = putBetween (take n previous) ++ previous
  where
    previous = pascal (n-1)

しかし、私の意見では、三角形を行のリストとして持つ方が良いです。

于 2012-11-13T15:15:13.820 に答える