0

并感谢您的帮助。我目前正在处理一项任务,并且一直被错误的递归调用所困扰。我有一个简单的 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 的新手,它是方言,所以任何帮助都会非常感激。

谢谢!

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

4

1 回答 1

1

很难回答,因为我看到代码有很多问题。

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

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

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

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

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

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

于 2013-04-08T03:57:45.790 回答