递归
定义:一个函数自己直接或间接调用自己
满足递归的三个条件:
- 递归必须得有一个明确的终止条件
- 该递归所处理的数据规模必须在递减
- 这个转化必须是可解的
循环和递归
递归:易于理解;速度慢;存储空间大
循环:不易理解;速度快;存储空间小
举例
求阶乘
1到100求和
汉诺塔
伪算法:
If(n>1)
{
先将A柱子上的前n-1个盘子从A借助C移到B
将A柱子上的第n个盘子直接移到C
再将B柱子上n-1个盘子借助A移到C
}
走迷宫
递归的应用:
树和森林就是以递归的方式定义的
树和图的很多算法都是以递归来实现的
很多数学方式就是以递归的方式定义的
斐波那契数列:1 2 3 5 8 13 21 34
汉诺塔实现代码:
#include <stdio.h>
void hannuota(int n,char A,char B,char C)
{
/*
如果是1个盘子
直接将A柱子上的盘子从A移到C
否则
先将A柱子上的前n-1个盘子从A借助C移到B
将A柱子上的第n个盘子直接移到C
再将B柱子上n-1个盘子借助A移到C
*/
if(1 == n)
{
printf("将编号为:%d的盘子直接从%c柱子移到%c柱子\n",n,A,C);
}
else
{
hannuota(n-1,A,C,B);
printf("将编号为:%d的盘子从%c柱子移到%c柱子\n",n,A,C);
hannuota(n-1,B,A,C);
}
}
int main(void)
{
char ch1='A';
char ch2='B';
char ch3='C';
int n;
printf("请输入盘子的个数:");
scanf("%d",&n);
hannuota(n,'A','B','C');
return 0;
}