我试图在Haskell中编写一个函数来生成三角形数字,我不允许使用递归,我应该使用迭代
这是我的代码......
triSeries 0 = [0]
triSeries n = take n $iterate (\x->(0+x)) 1
我知道迭代后的函数是错误的。 但是,几个小时都在寻找一个功能,请给我任何暗示吗?
答案 0 :(得分:1)
也许wikipedia可能是一个提示,例如
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]
谈论iterate
。也许有一些方法可以在这里使用它,但正如约翰所说,foldl
就足够了。看看this page,你在开始时看到的是什么。
答案 1 :(得分:1)
首先写出一些三角形数字
生成T(n)
的迭代过程是从[1..n]
开始,获取列表的第一个元素,并将其添加到运行总计中。在具有可变状态的语言中,您可以写:
def tri(n):
sum = 0
for x in [1..n]:
sum += x
return sum
在Haskell中,您可以通过fold
函数(foldl
,foldr
或某些变体)迭代地使用数字列表并累积状态。希望这足以开始使用。
答案 2 :(得分:0)
目前尚不清楚“不允许递归,使用迭代”是什么意思。所有看似“迭代”的函数都是递归的。
所有用途中的 iterate
只能使用常量修改输入,而iterate (+1) 1
与[1..]
相同。考虑使用Data.List
函数,该函数可以组合来自无限范围[1..]
的数字和先前计算的总和,以生成此类总和的无限列表:
T_i = I + T_ {I-1}
这绝对比x*(x+1) div 2
考虑使用Data.List
函数,该函数可以从无限的和列表中生成无限的有限总和列表。这将比计算10的列表便宜,然后是11个列表重复为10的列表重复相同的计算等。