当前位置:Gxlcms > mysql > 程序员面试宝典8.2典型递归问题

程序员面试宝典8.2典型递归问题

时间:2021-07-01 10:21:17 帮助过:13人阅读

今天看书看到8.2的递归问题,自己试了一下书上的代码,感觉尚有很多bug,于是自己写了一个。 主要是书中代码只是为了递归而递归,在递归的返回处理上做的不好。 贴上自己修改过的代码,仅作为日后复习之用。。 写程序时候发现几个问题,要注意: 1.一定要为v

今天看书看到8.2的递归问题,自己试了一下书上的代码,感觉尚有很多bug,于是自己写了一个。

主要是书中代码只是为了递归而递归,在递归的返回处理上做的不好。

贴上自己修改过的代码,仅作为日后复习之用。。

写程序时候发现几个问题,要注意:

1.一定要为vector**printarr=new vector*[slen];中申请的指针数组初始化,而初始化时,使用(*p+i)不能作为左值,改用p[i]即可。。

2.发现问题:使用*(*p+i)=i;赋值,调用时只能用指针+偏移值的方式,使用数组方式调用出错,如*p[i],而使用数组方式赋值,则只能使用数组方式调用。尚不明白是不是编译器的问题,留待学习。


#include
#include
#include
#include
using namespace std;

//建立比较串s在被比较串p中位置的vector。
void PrintfArrary(char* pstr,char* sstr,vector** printarr,int plen,int slen,int pstartnum,int sstartnum)
{


for(int i=sstartnum;i for(int j=pstartnum;j if(*(sstr+i)==*(pstr+j))
(*printarr[i]).push_back(j+1);
}

//递归调用,构建序列。
void printseq(vector** printarr,int slen,vector*out,int sum){
if(slen==0){
for(vector::iterator i((*out).begin());i!=(*out).end();i++)
cout<<*i;
cout< }


else
{
int i=sum-slen;
if(i){
for(vector::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::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** printarr=new vector*[slen];
for(int i=0;i

printarr[i]=new vector;
}
vector*out=new vector;
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;
}

人气教程排行