递归算法笔记

基本概念: 一个函数调用其本身就是递归。

一个简单的小例子:求n的阶乘

int Factorial(int n){

if (n == 0)

return 1;

else

return n * Factorial(n - 1);

}

这是一个比较简单的,可以比较容易的看出其递归的元素是什么。

递归与普通函数调用一样是通过栈来实现的。

19e9e3f516c9405189c5785644b6b1d3.jpg

 递归函数可以用来替代多重循环,上述就是典型案例。但更多的是用来将问题分解成规模更小的多个子问题来求解。

汉诺塔问题:古代有一个梵塔,塔内有三个座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;

}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值