递归
递归
定义:一个函数自己直接或者间接调用自己
递归满足的三个条件:
1. 递归必须有终止条件
2. 该函数所处理的数据规模必须在递减
3. 这个转化必须是可解的
循环和递归
所有的循环都可以转化为递归,递归不一定都可以转化为循环
递归: 易于理解, 速度慢, 存储空间大
循环: 不易理解, 速度快, 存储空间小
汉诺塔:这不是线性递归,是一个非线性递归
n=1 1
n=2 3
n=3 7
................
................
n=64 2的64次方减1【这是个天文数字,就算世界上最快的计算机也解决不了】
汉诺塔的复杂度是2的n次方减一
问题很复杂,但真正解决问题的编码就只有三句
#include <stdio.h> int hannuota(int n, char A, char B, char C) { /*如果是一个盘子 直接将A柱子上的盘子从A移到C 否则 先将A柱子上的n-1个盘子借助C移到B 直接将A柱子上的一个盘子从A移到C 最后将B柱子上的n-1个盘子借助A移到C*/ if(n==1) 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() { char ch1 = 'A'; char ch2 = 'B'; char ch3 = 'C'; int n; printf("请输入要移动的盘子的个数: "); scanf("%d", &n); hannuota(n, 'A', 'B', 'C'); return 0; }
用递归求阶乘
#include <stdio.h> int f(int n) { if(n==1) return 1; else return f(n-1)+n; } int main() { printf("%d",f(5)); return 0; }
用递归求1+2+3+4+5......+100=
#include <stdio.h> int sum(int n) { if(n==1) return 1; else return sum(n-1)+n; } int main() { int n; scanf("%d",&n); printf("%d",sum(n)); return 0; }