2012-01-23 40 views
1

如何在不使用任何赋值列表和迭代,仅递归的情况下在ocaml中编写子字符串函数?我只能使用string.length。在Ocaml中递归地创建自己的子函数

我想到目前为止

let substring s s2 start stop= 
if(start < stop) then 
    substring s s2 (start+1) stop 
    else s2;; 

,但显然是错误的,问题是,我如何能够通过正被逐步建成与递归调用的字符串?

回答

2

这感觉就像一个家庭作业问题,旨在教你考虑递归。对于我来说,如果您决定要使用的基本操作,那么考虑递归部分会更容易。你不能使用任务,列表或迭代,没关系。你需要以某种方式提取你的输入字符串的一部分,但你显然不能使用内置的子字符串函数来做到这一点,这将破坏练习的目的。唯一的其他操作,我能想到的是,从一个字符串中提取单个字符的一个:

# "abcd".[2];; 
- : char = 'c' 

您还需要一种方法来一个字符添加到字符串,给予较长的字符串。但是你不能使用任务来做到这一点。在我看来,你将不得不使用String.make到你的角色转换为字符串:

# String.make 1 'a';; 
- : string = "a" 

然后你就可以连接使用^操作两个字符串:

# "abc"^"def" 
- : string = "abcdef" 

你允许使用这三个操作?如果是这样,你可以开始考虑子串问题的递归部分。如果不是这样,那么我可能对这个问题的理解还不够充分,不能给出建议。 (或者,也许设置限制的人不希望你必须计算子串?通常这些限制也是你应该如何继续的一种暗示。)

继续讨论你的具体问题。在开始FP编程时,您通常不希望将答案传递给递归调用。您希望将较小的问题传递给递归调用,并从中获取的回复。对于子字符串问题,一个较小问题的例子是请求在包含字符串中进一步开始一个字符的子字符串,并且该字符串短一个字符。

(后来,你可能想通过部分答案到你的递归调用,以获得尾递归行为。我说不要担心现在。)

+0

让我澄清一下,如果我需要比较两个字符串与递归我将不得不检查一个字符串的第一个字符和第一个比再次调用该函数的其余字符串的权利?在这种情况下,我需要有两个字符串的子字符串。我不能在每次递归调用中使用一个变量来增加它,因为该函数不包含任何整数。那该怎么办?该函数的格式如下string-> string-> bool。 –

+1

这看起来像你问的另一页,http://stackoverflow.com/questions/8968171/caesar-cipher-check-in-ocaml。您可以使用子递归比较字符串同样的问题。然而,在FP中也常见用你需要的任何参数定义帮助函数。 –

+0

是的,我写了一个函数,它需要两个字符串和一个整数。因为子字符串是不允许的,所以需要递归遍历字符串的整数。然后我从原始函数调用该函数。我希望这会做。或者我可以写一个子字符串函数。 –

0

现在我不能给你这个答案,部分是因为这是你的家庭作业,部分原因是因为我已经触摸OCaml语法已经3年了,但我可以试着帮助你。

现在递归的基本原理是将问题分解成更小的版本。

您不会传递缓慢建立的字符串,而是使用您的递归函数生成除单个字符外几乎已建立的字符串,然后将该字符添加到字符串的末尾。

+0

是的,我可以建立一个字符串,这样的方式,我是新来OCaml中却丝毫编程之前,但要做到这一点,我定义使用字符串连接,我希望它是允许的,但如果没有的话,我只是想知道是否有其他方式可能,如果不是,我会用^代替。 –