![](/img/trans.png)
[英]How to create a tail recursion for this in Haskell [T = 1/x + x/2 + 3/x +x/4 + ...]
[英]how to do this in haskell ? [x^0,x^1,x^2,x^3 …]
我想要一个像这样的列表
[x^0,x^1,x^2,x^3 ...]
是否有可能有这样的清单
例如
ex : x = 2 [1,2,4,8,16,32 ..]
您可以使用iterate
或unfoldr
多次翻倍。 这可能比为每个n
计算x^n
更有效。
下面,我使用x=2
,但你可以使用任何x
。
> take 10 $ iterate (*2) 1
[1,2,4,8,16,32,64,128,256,512]
> take 10 $ unfoldr (\x -> Just (x,2*x)) 1
[1,2,4,8,16,32,64,128,256,512]
还要注意像Int
这样的有界整数类型会以这种方式快速溢出。
是的,在haskell中这很容易。
您创建一个无限的正数流,然后用函数n ↦ x^n
映射它们
f :: Num a => a -> [a]
f x = fmap (\n -> x^n) [0..]
> take 10 (f 2)
[1,2,4,8,16,32,64,128,256,512]
在Haskell中,无论进展如何,列表都是线性的。 线性,我的意思是非递归。 列表中的元素不依赖于一个或多个先前元素或初始元素。
在Haskell中,这些列表非常用。 在Haskell中,有两个主要设施用于生成此类列表。 第一个是map
,它没有任何过滤或递归是有效的。
f b n = map (b^) [0..n]
第二是列表理解
f b n = [b^x|x<-[0..n]]
两者都很容易在结果中设置元素的限制或数量。 如果需要,可以通过排除方程左侧和右侧的n
来将它们都制成无限列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.