2012-03-21 9 views
1

数値をリスト内包に斜めに配置した無限の行列を作成するにはどうすればよいですか?リスト内包で対角行列を構築する方法

[[ 1, 2, 4, 7, 11, ...], 
[ 3, 5, 8, 12, 17, ...], 
[ 6, 9, 13, 18, 24, ...], 
[10, 14, 19, 25, 32, ...], 
...] 

私はこのようにそれを行うにしようとしました:

firstColumn = take 6 $ map fst $ iterate (\(a,b) -> (a+b,b+1)) (1,2) 
matr :: [[Int]] 
matr = [take 6 $ map fst $ iterate (\(x,y) -> (x+y, y+1)) (a, i) | a <- firstColumn, let i = 1] 

しかし、どのように、私は追加の行に対して反復んどのように他の言葉で次のすべての行(に(i + 1)に渡すことができますxとyの指標の計算式を求めることにより)

+0

あなたは何を試してみましたか?あなたはそれの数学的な側面をする方法を知っていますか、それとも同様に助けが必要ですか?この宿題ですか? – dave4420

+0

そして、それはなぜリストの理解を使用しなければならないのですか? – dave4420

+0

これは宿題の一部ですが、私はこの理解にいくつかのことを試してきましたので、理解するために今どのようにしたいのですか)他のものを使う方がはるかに簡単かもしれないと思います) – overwriter

答えて

2

、FE:

[[ 1 + (x + y) * (x + y + 1) `div` 2 + y | x <- [0..]] | y <- [0..]]