欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

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

程序员文章站 2022-06-14 20:34:35
...

今天看书看到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 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;
}