我正在尝试获取一个递归函数,该函数应该比较两个int数组,并说是否array2是array1的子序列。 我的问题是,现在我不知道何时设置bool递归函数的返回值。 我很高兴为您提供帮助。
int array1 [] = {1 ,2 ,3 ,4 ,5 ,6,7,8,9,10};
int array2 [] = {2,4,6,8};
int l1 = 10;
int l2 = 4;
bool isSubset ( int p1 , int p2) {
while (p1 <= l1) {
if (array1[p1] == array2[p2]) {
isSubset(p1 + 1, p2 + 1);
} else {
isSubset(p1 + 1, p2);
}
}
}
int main (void) {
if ( isSubset(0,0))
cout << "yes" << endl ;
else
cout << " no " << endl ;
return 0;
}
答案 0 :(得分:0)
如果找到了true
的所有项(即,如果array2
),则返回p2 == l2
。如果您已经到达array1
的末尾,但是仍然找不到array2
的某些项目,请返回false
。
否则,收集所有isSubset
递归调用的结果,如果至少有一个true
,则返回true
。
代码:
bool isSubset ( int p1 , int p2) {
if(p2 >= l2) return true; // we have found all array2's items
if(p1 >= l1) return false;
bool result = false;
while (p1 < l1 && !result) { // whether we have found the subsequence - break the loop
if (array1[p1] == array2[p2]) {
result |= isSubset(p1 + 1, p2 + 1);
} else {
result |= isSubset(p1 + 1, p2);
}
++p1;
}
return result;
}
您在这里不需要while循环,这也可以工作:
bool isSubset ( int p1 , int p2) {
if(p2 >= l2) return true; // we have found all array2's items
if(p1 >= l1) return false;
if(array1[p1] == array2[p2]){
return isSubset(p1 + 1, p2 + 1);
}else{
return isSubset(p1 + 1, p2);
}
}
或更短:
bool isSubset ( int p1 , int p2) {
if(p2 >= l2) return true; // we have found all array2's items
if(p1 >= l1) return false;
return isSubset(p1 + 1 , p2 + (array1[p1] == array2[p2]));
}
p.s。在这种情况下,isSubset
是坏名字,因为此算法对顺序敏感。
答案 1 :(得分:0)
#include<bits/stdc++.h>
using namespace std;
int subs(string input,string output[]){
if(input.length()==0){
output[0]="";
return 1;
}
string smallstring=input.substr(1);
int smallans=subs(smallstring,output);
for(int i=0;i<smallans;i++){
output[i+smallans]=input[0]+output[i];
}
return 2*smallans;
}
int main(){
string input;
cin>>input;
int len=input.length();
int osize=pow(2,len);
string *output=new string[osize];
int count=subs(input,output);
for(int i=0;i<count;i++){
cout<<output[i]<<endl;
}
}