haskell迭代法生成三角数
我试图用Haskell编写一个函数来生成三角数,我不允许使用递归,我应该使用迭代 这是我的密码haskell迭代法生成三角数,haskell,Haskell,我试图用Haskell编写一个函数来生成三角数,我不允许使用递归,我应该使用迭代 这是我的密码 triSeries 0 = [0] triSeries n = take n $iterate (\x->(0+x)) 1 我知道迭代后的函数是错误的。 但是寻找一个函数已经花了好几个小时了,有什么提示吗?可能是一个提示,比如 triangular :: Int -> Int triangular x = x * (x + 1) `div` 2 可以从中得到 triSeries可以是
triSeries 0 = [0]
triSeries n = take n $iterate (\x->(0+x)) 1
我知道迭代后的函数是错误的。
但是寻找一个函数已经花了好几个小时了,有什么提示吗?可能是一个提示,比如
triangular :: Int -> Int
triangular x = x * (x + 1) `div` 2
可以从中得到
triSeries
可以是
triSeries :: Int -> [Int]
triSeries x = map triangular [1..x]
就是这样工作的
> triSeries 10
[1,3,6,10,15,21,28,36,45,55]
谈论
迭代
。也许这里有一些方法可以使用它,但正如John所说,foldl
就足够了。看一看,你在看什么是在一开始 先写出一些三角形数字
- T(1)=1
- T(2)=1+2
- T(3)=1+2+3
T(n)
的迭代过程是从[1..n]
开始,获取列表的第一个元素,并将其添加到运行总数中。在具有可变状态的语言中,您可以编写:
def tri(n):
sum = 0
for x in [1..n]:
sum += x
return sum
在Haskell中,您可以通过
fold
函数(foldl
,foldr
,或一些变体)迭代使用数字列表并累积状态。希望这就足够开始了。不清楚什么是“不允许递归,使用迭代”。所有看似“迭代”的函数在内部都是递归的
iterate
在所有使用中只能使用常量修改输入,iterate(+1)1
与[1..]
相同。考虑使用<代码>数据>列表>代码>函数,该函数可以将无限范围内的代码<代码> [1…] /代码>和先前计算的总和组合在一起,生成这样的和的无限列表:
T_i=i+T_{i-1}
这肯定比x*(x+1)div 2
考虑使用一个
Data.List
函数,该函数可以从无限和列表生成无限和列表。这将比计算一个10的列表要便宜,然后计算一个11的列表重复对10的列表所做的相同计算,等等。我不认为这个封闭形式的解决方案算作迭代。虽然这肯定是最好的方法。如果作业任务的语句包含“不使用递归”(很难想象在这里使用递归的特殊原因),这个解决方案可以被解释为有效的。-БМММПППЙМАЛПБССССССССССb非常感谢我使用了你的帮助,我让它工作了:)triSeries 0=[0]triSeries n=映射三角形$take n$iterate(+1)1,其中三角形x=x*(x+1)div
2您仍然不需要使用triSeries 0=[0]