我试图写在Haskell的函数产生三角号使用迭代三角号,我不允许使用递归,我应该使用迭代生成哈斯克尔
这里是我的代码...
triSeries 0 = [0]
triSeries n = take n $iterate (\x->(0+x)) 1
我知道迭代后我的函数是错误的。 但它一直在寻找一个功能,任何暗示好吗?
我试图写在Haskell的函数产生三角号使用迭代三角号,我不允许使用递归,我应该使用迭代生成哈斯克尔
这里是我的代码...
triSeries 0 = [0]
triSeries n = take n $iterate (\x->(0+x)) 1
我知道迭代后我的函数是错误的。 但它一直在寻找一个功能,任何暗示好吗?
开始通过写入一些三角形的号码
生成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..]
相同。考虑使用Data.List
功能,可以组合来自无限范围[1..]
一个数和先前计算的总和,以产生这样的和的无穷列表:
T_i = I + T_ {I-1}
这绝对便宜比x*(x+1) div 2
考虑使用Data.List
函数,该函数可以从无限的和值列表中产生有限的和值列表的无限列表。这比计算10列表要便宜,然后列出11列表,重复10列表的相同计算,等等。
我不认为这种封闭形式的解决方案算作迭代。尽管这当然是最好的方法。 –
如果作业任务的语句包含“不使用递归”(很难想象它可以在这里使用什么特定原因),这个解决方案可以被解释为有效。 –
它没有工作 – user2277918