OCAML递归函数没有停止

时间:2013-04-08 03:09:46

标签: recursion ocaml ml

谢谢你的帮助。我目前正在做一个分配,我一直坚持错误的递归调用。 我有一个简单的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);;

Longitud是定义大小的整数。我担心我做的事情非常糟糕,因为它似乎无限循环,因为“纵向”永远不会达到0.我(正如你猜测的那样)是新的ML和它的方言,所以任何帮助都会非常感激。

谢谢!

编辑:解决了它,实际上并非如此......原来我在列表中使用逗号调用函数,而不是分号。是的。谢谢!!

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

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