如何在ocaml中编写子字符串函数而不使用任何赋值列表和迭代,只有递归?我只能使用string.length。
我到目前为止尝试过
let substring s s2 start stop=
if(start < stop) then
substring s s2 (start+1) stop
else s2;;
但显然这是错误的,问题是如何通过递归调用逐步传递正在构建的字符串?
答案 0 :(得分:2)
这感觉就像是一个家庭作业问题,旨在教你思考递归。对我来说,如果您决定要使用的基本操作,那么考虑递归部分会更容易。你不能使用赋值,列表或迭代,好的。你需要以某种方式提取输入字符串的一部分,但显然你不能使用内置的子字符串函数来做到这一点,这会破坏练习的目的。我能想到的唯一其他操作是从字符串中提取单个字符的操作:
# "abcd".[2];;
- : char = 'c'
您还需要一种方法来将字符添加到字符串中,从而提供更长的字符串。但是你不允许使用任务来做到这一点。在我看来,你将不得不使用String.make
将你的角色翻译成一个字符串:
# String.make 1 'a';;
- : string = "a"
然后,您可以使用^
运算符连接两个字符串:
# "abc" ^ "def"
- : string = "abcdef"
您是否可以使用这三项操作?如果是这样,您可以开始考虑子字符串问题的递归部分。如果没有,那么我可能还不能很好地理解这个问题,但却没有给出建议。 (或者也许设置限制的人不希望你必须计算子串?通常这些限制也是你应该如何进行的一种暗示。)
继续讨论您的具体问题。在开始FP编程时,通常不希望将答案传递给递归调用。您希望将较小的问题传递给递归调用,并从中获取返回的答案。对于子字符串问题,一个较小问题的一个例子是要求在包含字符串中进一步开始一个字符的子字符串,这是一个字符更短。
(稍后,您可能希望将部分答案传递给递归调用以获得尾递归行为。我说暂时不要担心它。)
答案 1 :(得分:0)
现在我无法给你答案,部分原因是因为这是你的功课,部分是因为我已经用了3年的时间来触及OCaml语法,但我可以试着帮助你。
现在递归背后的基本原理是将问题分解为更小版本的自身。
您不传递缓慢构建的字符串,而是使用递归函数生成几乎构建的字符串(单个字符除外),然后将该字符添加到字符串的末尾。