【问题标题】:concatenating recursion in SMLSML 中的串联递归
【发布时间】:2013-01-25 11:25:30
【问题描述】:

我是另一个尝试使用 SML 元素完成 MOOC 课程的初学者。我想生成一个函数,它接受一个列表,并生成第二个包含元素总和的列表。

如果操作正确,此函数将转换 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))

我知道这将省略初始列表的最后一个元素。但是这样的事情会起作用吗?

【问题讨论】:

    标签: list recursion functional-programming sml


    【解决方案1】:

    您的问题在于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
    

    这实际上是一个很好的例子,说明为什么模式匹配是一件好事。

    【讨论】:

    • 我只做了一个星期,所以我真的不知道这里发生了什么(我还没有被介绍给管道)。你能不能用我自己的风格来展示?
    猜你喜欢
    • 2015-06-19
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 2011-12-22
    • 2021-05-26
    • 2011-10-24
    • 1970-01-01
    • 2021-07-20
    相关资源
    最近更新 更多