2015-09-05 59 views
0

我有一些锻炼的问题。 我必须找到最长的子字符串。Ocaml最长的子串

例子:

"AGATGCCATTGTCCCCGACAACCAGCCA" 

这我倒要转变成列表,找到最长的串/搜索和打印结果CCCC

我的功能必须是这样的function search : char list -> unit

而且我不能使用Module Str

+4

“AGATGCCATTGTCCCCGACAACCAGCCA”的最长子串是“AGATGCCATTGTCCCCGACAACCAGCCA”。 – melpomene

+1

你有什么想法解决这个问题?你有没有编写任何(伪)代码来解决它?如果是这样,请向我们展示并解释您为什么认为它不起作用。显然,你不希望SO评论者只为你回答你的作业,对吧? –

+0

呵呵,对,不,Iam仍在尝试自己,但我卡住了。我有一些想法,但我不知道如何实现它。我想用“匹配”功能和一些变量来保存当前最长的数字和字符串。但后来我无法计算它或我该怎么办如果我发现一些更长的子字符串,如何重置前一个。谢谢! –

回答

0

不确定此答案是否合适。我相信我应该给一个提示。

回想一下在数组中寻找最大值的迭代算法。

int maximum = array[0]; 
for (i = 1; i < length; i++){ 
    if (array[i] > maximum){ 
     maximum = array[i]; 
    } 
} 

的代码转换成递归一个,因为我们走,我们不变异值,但在下次调用不同的参数。

let max_in_list = 
let rec aux maximum l = match l with 
    |[] -> maximum 
    |x :: xs -> aux (max maximum x) xs in 
function 
    |[] -> invalid_arg "empty list" 
    |x :: xs -> aux x xs 

注意如何maximum变量在每一个递归调用“改变”,就像在重复突变变量。 当然这不是惯用的方式,因为递归可以用List.fold_left完成。

如果你真的不知道如何“递归思考”,试着想出一个带循环的算法,并将其“转化”为递归。