Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
haskell迭代法生成三角数_Haskell - Fatal编程技术网

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可以是

我试图用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]

谈论
迭代
。也许这里有一些方法可以使用它,但正如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]