基本概念: 一个函数调用其本身就是递归。
一个简单的小例子:求n的阶乘
int Factorial(int n){
if (n == 0)
return 1;
else
return n * Factorial(n - 1);
}
这是一个比较简单的,可以比较容易的看出其递归的元素是什么。
递归与普通函数调用一样是通过栈来实现的。
递归函数可以用来替代多重循环,上述就是典型案例。但更多的是用来将问题分解成规模更小的多个子问题来求解。
汉诺塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小
不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移
到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子
始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求输出移动的步骤。
代码:
include<iostream>
using namespace std;
void Hanoi(int n, char sre,char mid,char dest)
{
if(n == 1)//只需移动一个盘子
cout << src <=->< dest << end1
//直接将盘子从src移动到dest即可
return ;//递归终止
Hanoi(n-1,src,dest,mid);//先将n-1个盘子从sr
cout << src<"->"<< dest << endl;
//再将一个盘子从src移动到dest
Hanoi(n-1,mid,src,dest);//最后将n-1个盘子从
return ;
}
int main()
{
int n;
cin >> n;
//输入盘子数目
Hangi(n,'A','B','c')
return 0;
}
或者解决一些原本就是用递归形式定义的问题。比如波兰表达式
逆波兰表达式:
1)一个数是一个逆波兰表达式,值为该数
2)"运算符 逆波兰表达式 逆波兰表达式”是逆波兰表
达式,值为两个逆波兰表达式的值运算的结果。
代码:
double exp(){
//读入一个逆波兰表达式,并计算其值
char s[20];
cin >> s;
switch(s[0]){
case '+': return exp()+exp();
case '-': Feturn exp()-exp();
case '*': return exp()*exp();
case '/': return exp()/exp();
default: return atof(s);
break;
}
}
int main(){
printf("%lf",exp());
return 0;
}