目录
递归知识点:
递归操作:
阶乘的循环实现:
阶乘的递归实现:
经典的汉诺塔问题:
这篇笔记是根据郝斌老师的上课讲义整理而得。
递归知识点:
定义:一个函数自己直接或间接调用自己 。
举例:
1. 求阶乘
2. 求和
3. 汉诺塔
满足递归的三个条件:
1. 递归必须得有一个明确的中止条件
2. 该函数所处理的数据规模在递减
3. 这个转化必须是可靠的
循环和递归
递归:
易于理解,速度慢,存储空间大,
循环:
不易理解,速度快,存储空间小
汉诺塔复杂度:2的n次方减1.
走迷宫
递归的应用:
树和森林就是以递归的方式定义的
数和图的很多算法就是都是以递归实现的
很多数学公式就是以递归的方式定义的。
递归操作:
阶乘的循环实现:
int main(){int val;int i, mult=1;printf("请输入一个数字: ");printf("val = ");scanf("%d", &val);for (i=1; i<=val; ++i)mult = mult * i;printf("%d的阶乘是:%d\n", val, mult);}
阶乘的递归实现:
//假定n的值是1或大于1的值
long f(long n)
{if (1 == n)return 1;elsereturn f(n-1) * n;}
经典的汉诺塔问题:
当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上。
当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C塔上。
当A塔上有3个盘子时,先将A塔上编号1至2的盘子(共2个)移动到B塔上(需借助C塔),然后将A塔上的3号最大的盘子移动到C塔,最后将B塔上的两个盘子借助A塔移动到C塔上。
当A塔上有n个盘子是,先将A塔上编号1至n-1的盘子(共n-1个)移动到B塔上(借助C塔),然后将A塔上最大的n号盘子移动到C塔上,最后将B塔上的n-1个盘子借助A塔移动到C塔上。
综上所述,除了只有一个盘子时不需要借助其他塔外,其余情况均一样(只是事件的复杂程度不一样)。
#include <stdio.h>2017-12-10汉诺塔实现
void hannuota(int n, char A, char B, char 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 val;printf("请输入要移动盘子的个数:");scanf("%d", &val);printf("盘子个数为:%d\n",val);hannuota(val, ch1, ch2, ch3);return 0;
}