3

リストの初期化の積を取り、その要素を複製する関数が必要です。

たとえば、リストは次のとおり[2, 3, 4, 5]です。

その inits の積 : [1, 2, 6, 24, 120].

最後に、リストは次のようになります[1, 1, 2, 2, 2, 6, 6, 6, 6, 24, 24, 24, 24, 24]

私の問題は、[1, 2, 6, 24, 120]変化してはならないということですが、私はそれを解決できません。私はhaskellにかなり慣れていません。このコードを変更する必要はありません。新しいコードを作成できます。

makeSystem :: Integral a => [a] -> [a]
makeSystem l= replicate (l !! 0) ((map product(inits l))!!0) ++ asd (tail l) where
 inits [] = [[]]
 inits (x:xs) = [[]] ++ map (x:) (inits xs)

もう一つの例:makeSystem [5,2,5,2,5,2]

結果:[1, 1, 1, 1, 1, 5, 5, 10, 10, 10, 10, 10, 50, 50, 100, 100, 100, 100, 100, 500, 500]

4

1 に答える 1

12

最初の部分では、標準関数を使用できますscanl

> scanl (*) 1 [2, 3, 4, 5]
[1,2,6,24,120]

2 番目の部分については、zipWithwith でreplicateほとんどの方法を取得できます。

> zipWith replicate [2, 3, 4, 5] [1, 2, 6, 24, 120]
[[1,1],[2,2,2],[6,6,6,6],[24,24,24,24,24]]

次に、concatこれらのリストが必要です。

すべてを一緒に入れて:

> let makeSystem xs = concat $ zipWith replicate xs (scanl (*) 1 xs)
> makeSystem [2, 3, 4, 5]
[1,1,2,2,2,6,6,6,6,24,24,24,24,24]
> makeSystem [5, 2, 5, 2, 5, 2]
[1,1,1,1,1,5,5,10,10,10,10,10,50,50,100,100,100,100,100,500,500]
于 2013-05-11T23:30:29.720 に答える