2013-09-28 59 views
0

我试图写在Haskell的函数产生三角号使用迭代三角号,我不允许使用递归,我应该使用迭代生成哈斯克尔

这里是我的代码...

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

我知道迭代后我的函数是错误的。 但它一直在寻找一个功能,任何暗示好吗?

回答

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。也许有一些方法可以在这里使用它,但正如John所说,foldl就足够了。看看this page,你在看什么是最开始的。

+0

我不认为这种封闭形式的解决方案算作迭代。尽管这当然是最好的方法。 –

+0

如果作业任务的语句包含“不使用递归”(很难想象它可以在这里使用什么特定原因),这个解决方案可以被解释为有效。 –

+0

它没有工作 – user2277918

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,或某些变体)积累状态。希望这足以让你开始。

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列表的相同计算,等等。