私は、フィボナッチ数と階乗のリストについて、以下のように行ったのと同じように、無限のパワーのリストを作成しようとしています。
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
facs = 1 : zipWith (*) [1 ..] facs
ありがとう
私は、フィボナッチ数と階乗のリストについて、以下のように行ったのと同じように、無限のパワーのリストを作成しようとしています。
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
facs = 1 : zipWith (*) [1 ..] facs
ありがとう
数値のべき乗を生成するのは、'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)
読みやすくするために、次のものも使用できます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]
リスト内包表記だけで正方形の無限のシーケンスを定義できると思います。
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]
powers n = 1 : map (n*) (powers n)