递归函数-子序列

时间:2018-07-21 12:54:47

标签: c++ recursion boolean subsequence

我正在尝试获取一个递归函数,该函数应该比较两个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;
}

2 个答案:

答案 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;
    }
}