今天看书看到8.2的递归问题,自己试了一下书上的代码,感觉尚有很多bug,于是自己写了一个。
主要是书中代码只是为了递归而递归,在递归的返回处理上做的不好。
贴上自己修改过的代码,仅作为日后复习之用。。
写程序时候发现几个问题,要注意:
1.一定要为vector<int>**printarr=new vector<int>*[slen];中申请的指针数组初始化,而初始化时,使用(*p+i)不能作为左值,改用p[i]即可。。
2.发现问题:使用*(*p+i)=i;赋值,调用时只能用指针+偏移值的方式,使用数组方式调用出错,如*p[i],而使用数组方式赋值,则只能使用数组方式调用。尚不明白是不是编译器的问题,留待学习。
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
using namespace std;
//建立比较串s在被比较串p中位置的vector。
void PrintfArrary(char* pstr,char* sstr,vector<int>** printarr,int plen,int slen,int pstartnum,int sstartnum)
{
for(int i=sstartnum;i<slen;i++)
for(int j=pstartnum;j<plen;j++)
if(*(sstr+i)==*(pstr+j))
(*printarr[i]).push_back(j+1);
}
//递归调用,构建序列。
void printseq(vector<int>** printarr,int slen,vector<int>*out,int sum){
if(slen==0){
for(vector<int>::iterator i((*out).begin());i!=(*out).end();i++)
cout<<*i;
cout<<endl;
}
else
{
int i=sum-slen;
if(i){
for(vector<int>::iterator j((*printarr[i]).begin());j!=(*printarr[i]).end();j++){
if(*j>*((*out).end()-1)){
(*out).push_back((*j));
printseq(printarr,slen-1,out,sum);
(*out).erase((*out).end()-1,(*out).end());
}
}
}
else
for(vector<int>::iterator j((*(*printarr)).begin());j!=(*(*printarr)).end();j++){
(*out).push_back((*j));
printseq(printarr,slen-1,out,sum);
(*out).erase((*out).end()-1,(*out).end());
}
}
}
//初始化及传递数据。
void ConnectSequence(char* pstr,char* sstr)
{
int plen=strlen(pstr);
int slen=strlen(sstr);
vector<int>** printarr=new vector<int>*[slen];
for(int i=0;i<slen;i++){
printarr[i]=new vector<int>;
}
vector<int>*out=new vector<int>;
PrintfArrary(pstr,sstr,printarr,plen ,slen,0,0);
printseq(printarr,slen,out,slen);
}
int main(){
char* a="abdbccab";
char* b="abc";
ConnectSequence(a,b);
return 0;
}