2013-02-10 75 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