【发布时间】:2016-07-10 09:30:39
【问题描述】:
我必须编写一个递归函数来计算短数组 s2 在更大的数组 s1 中出现的次数而不重叠。我可以使用多个可以帮助我的函数,但它们必须都是递归函数。例如:
#define n 10
#define p 2
s1[n]={0,2,3,23,54,1,8,23,54,1}
s2[p]={23,54}
OUTPUT: 2 (we see s2 two times in s1)
我想写一个递归函数,告诉我是否至少有一次出现,然后在另一个计算出现次数的递归函数中使用这个函数。所以这就是我写的:
//Initially pos1=0 and pos2=0
int find(int *s1,int *s2,int pos1,int pos2){
if(n-pos1<p-pos2)
return 0;
if(*(s1+pos1)==*(s2+pos2)){
if(pos2==p-1)
return pos1;
else{
if(find(s1,s2,pos1+1,pos2+1))
return pos1;
}
}
return find(s1,s2,pos1+1,0);
}
然后我写了第二个应该计算出现次数的递归函数:
// Initially occ(s1,s2,0);
int occ(int *s1,int *s2,int memo){
if(memo==n){ //end of s1
return 0;
}
else{
if(find(s1+memo,s2,memo,0))
return 1+occ(s1+memo,s2,memo+p);
}
}
其背后的想法是验证是否至少出现了一次,如果有发生则计数,然后对 s1 的剩余部分重做验证,直到结束。
问题是第二个函数的代码根本不起作用,我找不到修复它的方法。
那么,如何使用上面编写的函数 find() 编写第二个递归函数来计算出现次数?
【问题讨论】:
-
为什么第二个函数的代码根本不起作用你调试了吗?
-
是的,我尝试了很多次,每次都失败,我发布的代码是我的最终结果。我不知道为什么会失败
-
如果 s1[n]={0,0,0,3,4,0,0,0,3,4,0,0,0,3,4,0,0 有效,0,3,4};和 s2[p]={3,4}。实际上输出为 4。但如果 s2[p]={0,0} 输出为 0,这是不正确的。
-
当使用你上面提到的代码并打印函数的结果很好:
printf("%d",find(s1,s2,0,0));结果我得到 3,你确定你发布了你的最后一个版本吗? -
是的,我没有写其他任何东西,但是最终结果由 occ() 给出,函数 find 应该返回第一次出现的位置。
标签: c arrays recursion count find-occurrences