2013-02-10 63 views
0

我是另一個嘗試用SML元素完成MOOC課程的初學者。我想生成一個帶有列表的函數,並且生成第二個列表,其中的元素相加。在SML中連接遞歸

如果做得正確,該功能將改變 before_reaching_sum_test([1,2,3,4,5,6,7,8,9]);下面的列表 [1,3,6,10,16,23,31,40]

這是我到目前爲止,但我敢肯定,我錯誤地繞了。

fun before_reaching_sum_test(ints: int list) = 
if null (tl ints)  
then [] 
else (hd ints + hd (before_reaching_sum_test(tl ints)))::(before_reaching_sum_test(tl ints)) 

我知道,這將離開最初列表的最後一個元素。但會像這樣的工作?

回答

2

你的問題是這條線hd (before_reaching_sum_test(tl ints)),它不斷調用列表的尾部,直到它將返回空列表,然後你試圖把頭部。因此引發空例外。

它實際上可以「推前一數字進取」,並計算運行總和可以創建非常簡單

fun before_reaching_sum_test (x::y::xs) = x :: before_reaching_sum_test(x+y::xs) 
    | before_reaching_sum_test x = x 

更新

準備迎接衝擊

fun before_reaching_sum_test xs = 
    if null xs then xs (* empty list *) 
    else if null (tl xs) then xs (* one element list *) 
    else (* Two or more elements in the list *) 
     let 
     val x = hd xs 
     val y = hd (tl xs) 
     in 
     x :: before_reaching_sum_test (x+y :: tl (tl xs)) 
     end 

這實際上充當了爲什麼模式匹配是有一個很好的事情一個很好的例子。

+1

我只做了一個星期,所以我真的不知道這裏發生了什麼(我沒有被引入管道)。你能否以類似於我自己的風格演示? – Joseph 2013-02-10 02:44:30