递归的基本概念
一个函数调用其自身,就是递归。
例1
求n!的递归函数
int Factorial(int n){
if(n==0)
return 1;
else
return n*Factorial(n-1);
}
递归的作用
- 替代多重循环
- 解决本来就是用递归型式定义的问题
- 将问题分解为规模更小的子问题进行求解
…
例2
汉诺塔问题
void Hanoi(int n,char src,char mid,char dest){
if(n==1){
cout<<src<<"->"<<dest<<endl;
return;
}
Hanoi(n-1,src,dest,mid);
cout<<src<<"->"<<dest<<endl;
Hanoi(n-1,mid,src,dest);
return;
}
例3
n皇后问题(用递归替代多重循环)
void NQueen(int k){
int i;
if(k==N){
for(i==0;i<N;i++)
cout<<queenPos[i]+1<<" ";
cout<<endl;
return;
}
for(i=0;i<N;i++){
int j;
for(j=0;j<k;j++){
if(queenPos[j]==i||
abs(queenPos[j]-i)==abs(k-j)){
break;
}
}
if(j==k){
queenPos[k]=i;
NQueen(k+1);
}
}
}
例4
波兰表达式即前缀表达式(用递归解决递归型式的问题)
定义:
- 一个数是一个波兰表达式,值为该数。
- “运算符 波兰表达式 波兰表达式” 是波兰表达式,值为两个波兰表达式的值运算的结果。
double exp(){
char s[20];
cin>>s;
switch(s[0]){
case '+': return exp()+exp();
case '-': return exp()-exp();
case '*': return exp()*exp();
case '/': return exp()/exp();
default: return atof(s);//字符转浮点数,需调用cstdlib
break;
}
}