我正在尝试在 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
我知道迭代后我的函数是错误的。但是寻找一个功能已经好几个小时了,请问有什么提示吗?
也许维基百科可能是一个提示,比如
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
就足够了。看看这个页面,你在看什么是最开始的。
首先写出一些三角数
生成的迭代过程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 的列表进行的相同计算,等等。