簡體   English   中英

如何在haskell中使用以下方法獲得無限的權力列表

[英]How do I get an infinite list of powers using the below methods in haskell

我一直在嘗試做一個無限的冪列表,就像我在下面做的那樣,為一個斐波那契數列和階乘列表。

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

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

謝謝

生成一個數的冪就像使用“迭代”一樣簡單:

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感到不舒服,這里有兩個替代版本:

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)

如果您想要zipWith無限的冪 N 列表,這可能是一個簡單的方法:

powersOfN :: [Integer]
powersOfN
  = zipWith (^) [N,N..] [0,1..]

以下是 2 的冪的示例:

Prelude> zipWith (^) [2,2..] [0,1..]
=>[1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728..]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM