2013-09-28 55 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列表的相同計算,等等。