使用haskell中的迭代生成三角数

时间:2013-09-28 04:25:40

标签: haskell

我试图在Haskell中编写一个函数来生成三角形数字,我不允许使用递归,我应该使用迭代

这是我的代码......

triSeries 0 = [0] 
triSeries n = take n $iterate (\x->(0+x)) 1

我知道迭代后的函数是错误的。 但是,几个小时都在寻找一个功能,请给我任何暗示吗?

3 个答案:

答案 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(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函数(foldlfoldr或某些变体)迭代地使用数字列表并累积状态。希望这足以开始使用。

答案 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的列表重复相同的计算等。