【问题标题】:OCAML Recursive function not stoppingOCAML 递归函数没有停止
【发布时间】:2013-03-30 00:52:33
【问题描述】:

感谢您的帮助。我目前正在处理一项任务,并且遇到了错误的递归调用。 我有一个简单的 CAML-Light 函数,它应该接受一个列表和一个大小(数字),并返回一个包含该列表的一部分、该大小的列表以及一个包含其余部分的列表。其实很简单,就是从过去的 PLT-Scheme 项目中翻译过来的。

但是,递归调用有问题。我只是不知道为什么它不起作用。函数是这样的:

let rec cortar texto longitud resultado = match texto, longitud with
            |  _::t,0 -> resultado::(t::[])
            |  c::t,x-> cortar t (longitud-1) (consderecha resultado c);;

经度是定义大小的整数。恐怕我做错了什么,因为它似乎无限循环,因为“经度”永远不会达到 0。我(你可能猜到)是 ML 的新手,它是方言,所以任何帮助都会非常感激。

谢谢!

编辑:解决了,实际上并没有……原来我是在列表中用逗号而不是分号调用函数。是的。所以谢谢!!

【问题讨论】:

    标签: recursion ocaml ml


    【解决方案1】:

    很难回答,因为我发现代码有很多问题。

    你说你的函数需要一个列表和一个大小,但你在这里定义的函数需要三个参数。看来resultado 参数是一个累积的结果。将此参数添加到您的外部函数中有点不整洁。通常,您希望将其添加到内部函数中,以便外部函数与您的描述相匹配(即,它需要两个参数)。

    match 语句中的两种模式都假定texto 不为空。这意味着您的模式并非详尽无遗,即如果 texto 最初或在递归调用中为 null,则该函数将失败。

    您的函数使用了一个名为consderecha 的函数,该函数未在任何地方定义。我将假设它有一个相反的缺点,即它在列表的末尾添加一个值。 (这不是处理列表的好方法。在列表末尾添加值很慢。)

    但是,如果您抛开所有这些问题,我认为您的递归没有任何问题。当我在定义它的情况下尝试您的功能时,它几乎可以工作。 (它似乎缺少列表中间的一个值。)

    # cortar [1;2;3;4;5] 2 [];;
    - : int list list = [[1; 2]; [4; 5]]
    

    您的函数可能没有启动,而不是没有停止。也许你忘了第三个参数?

    【讨论】:

    • 首先,感谢您的回答。是的,我知道第一个问题 ^^ 我专门将它用于从另一个函数调用它,但你是对的,我应该解决这个问题。 “Consderecha 就是这样做的,在列表末尾附加 @ 一个元素。我也知道这不是最好的方法,但这是我能想到的唯一方法。我非常愚蠢地忘记了 ML 分离元素在带有 ; 而不是 , 的列表上。是的,就是这样,信不信由你 T_T。
    • 所以,感谢您的帮助,非常抱歉浪费您的时间。也感谢您的建议!
    • 我很高兴,我不认为我的时间浪费了。
    猜你喜欢
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多