递归
定义:一个函数自己直接或间接调用自己 满足递归的三个条件:
- 递归必须得有一个明确的终止条件
- 该递归所处理的数据规模必须在递减
- 这个转化必须是可解的
循环和递归
递归:易于理解;速度慢;存储空间大 循环:不易理解;速度快;存储空间小 举例
求阶乘
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; }