我試圖寫在Haskell的函數產生三角號使用迭代三角號,我不允許使用遞歸,我應該使用迭代生成哈斯克爾
這裏是我的代碼...
triSeries 0 = [0]
triSeries n = take n $iterate (\x->(0+x)) 1
我知道迭代後我的函數是錯誤的。 但它一直在尋找一個功能,任何暗示好嗎?
我試圖寫在Haskell的函數產生三角號使用迭代三角號,我不允許使用遞歸,我應該使用迭代生成哈斯克爾
這裏是我的代碼...
triSeries 0 = [0]
triSeries n = take n $iterate (\x->(0+x)) 1
我知道迭代後我的函數是錯誤的。 但它一直在尋找一個功能,任何暗示好嗎?
開始通過寫入一些三角形的號碼
生成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..]
相同。考慮使用Data.List
功能,可以組合來自無限範圍[1..]
一個數和先前計算的總和,以產生這樣的和的無窮列表:
T_i = I + T_ {I-1}
這絕對便宜比x*(x+1) div 2
考慮使用Data.List
函數,該函數可以從無限的和值列表中產生有限的和值列表的無限列表。這比計算10列表要便宜,然後列出11列表,重複10列表的相同計算,等等。
我不認爲這種封閉形式的解決方案算作迭代。儘管這當然是最好的方法。 –
如果作業任務的語句包含「不使用遞歸」(很難想象它可以在這裏使用什麼特定原因),這個解決方案可以被解釋爲有效。 –
它沒有工作 – user2277918