6

私は、フィボナッチ数と階乗のリストについて、以下のように行ったのと同じように、無限のパワーのリストを作成しようとしています。

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

facs = 1 : zipWith (*) [1 ..] facs

ありがとう

4

5 に答える 5

7

数値のべき乗を生成するのは、'iterate' を使用するのと同じくらい簡単です。

iterate (*2) 1

特定のパワーを (それらを一覧表示する代わりに) 見つけるには、 を使用する方が高速(^)です。大規模な乗算の個々のステップを表示するには、次を使用できますscanl

scanl (*) 1 [2, 3, 5, 7]

最後に、すべての正方形のリストを生成するには、これが私が推奨するアプローチです。

fix (\more r s -> s : more (r + 1) (s + 2*r + 1)) 0 0

または、ここが気に入らない場合はfix、2 つの代替バージョンがあります。

unfoldr (\(r, s) -> Just (s, (r + 1, s + 2*r + 1))) (0, 0)

map snd . iterate (\(r, s) -> (r + 1, s + 2*r + 1)) $ (0, 0)
于 2012-11-18T17:26:46.627 に答える
4

読みやすくするために、次のものも使用できますmap

連続する 2 の累乗のリスト:

λ> map (2^) [0..10]
[1,2,4,8,16,32,64,128,256,512,1024]

連続した正方形:

λ> map (^2) [0..10]
[0,1,4,9,16,25,36,49,64,81,100]
于 2016-08-20T07:37:56.317 に答える
3

リスト内包表記だけで正方形の無限のシーケンスを定義できると思います。

powers = [ ii*ii | ii <- [1 ..]]

take 10 powers
=> [1,4,9,16,25,36,49,64,81,100]

編集: 2 の累乗を求めていると説明されていますが、これはリスト内包表記でも実行できます。

powersOf2 = [ 2^ii | ii <- [0 ..]]
take 10 powersOf2
=> [1,2,4,8,16,32,64,128,256,512]

これを任意のベースのジェネレーター関数に外挿できます。

powersOfN nn = [ nn^ii | ii <- [0 ..]]

take 10 (powersOfN 3)
=> [1,3,9,27,81,243,729,2187,6561,19683]

take 10 (powersOfN 17)
=> [1,17,289,4913,83521,1419857,24137569,410338673,6975757441,118587876497]
于 2012-11-18T16:56:18.913 に答える
2
powers n = 1 : map (n*) (powers n)
于 2012-11-18T17:16:10.477 に答える