我必須編寫一個遞歸函數來計算較大陣列s1中存在的短陣列s2的次數,而不會重疊。我可以使用多個可以幫助我的函數,但它們必須是遞歸函數。例如:使用遞歸計算較大陣列中的子陣列的出現次數
#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)
我想過寫一個遞歸函數,它告訴我,如果有則至少有一個occurence在計數出現次數的數量與另一遞歸函數使用此功能。所以這是我寫的:
//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);
}
然後我寫了一個應該算OCCURENCES數量第二遞歸函數:
// 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()計算出現次數?
爲什麼第二個函數的代碼根本不起作用,您是否嘗試調試它? – fedi
是的,我嘗試了很多次,每次都失敗了,我發佈的代碼是我的最終結果。我不知道爲什麼它會失敗 – Dipok
它的工作原理如果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,這是不正確的。 – Dipok