0

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

这是我的代码...

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

我知道迭代后我的函数是错误的。但是寻找一个功能已经好几个小时了,请问有什么提示吗?

4

3 回答 3

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就足够了。看看这个页面,你在看什么是最开始的。

于 2013-09-28T04:30:40.640 回答
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或某些变体)累积状态。希望这足以开始。

于 2013-09-28T04:43:34.883 回答
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 的列表进行的相同计算,等等。

于 2013-09-28T09:22:03.993 回答