专题 递归
定义 把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称做递归函数。
递归的思想 将大规模(n)的问题转换成小规模(n-1)的问题解决
递归满足三个条件
- 递归必须得有一个明确得中止条件
- 该函数所处理得数据规模必须在递减
- 这个转化必须是可解得
循环和递归得关系
递归的特点:
(1)易于理解
(2)速度慢
(3)存储空间大
循环的特点:
(1)不易理解
(2)速度快
(3)存储空间小
举例
- 求阶乘
- 1+2+3+ ... 100得和
- 汉诺塔
-
走迷宫
有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:
1. 每次只能移动一个圆盘;
2. 大盘不能叠在小盘上面。
伪算法
if (n>1)
{
先把A柱子上得前n-1个盘子从A借助C移到B
将A柱子上得第n个盘子直接移到C
再将B柱子上得n-1个盘子借助A移到C
}
# include <stdio.h>
long factorial(long n);
long sum(int n);
void hanio(int n, char A, char B, char C);
long Fibonacci(int n);
int main(void)
{
printf("阶乘的值%ld\n", factorial(5));
printf("求和的值%ld\n", sum(100));
hanio(3, 'A', 'B', 'C');
printf("斐波那契的值%ld\n", Fibonacci(5));
return 0;
}
// 假定n的值是1或大于1de值
long factorial(long n)
{
if (1 == n)
return 1;
else
return factorial(n - 1)*n;
}
long sum(int n)
{
if (1 == n)
return 1;
else
return sum(n - 1) + n;
}
void hanio(int n, char A, char B, char C)
{
/*
如果是1个盘子
直接将A柱上的盘子从A移到C
否则
先将A柱上的n-1个盘子借助C移到B
直接将A柱上的盘子从A移到C
最后将B柱上的n-1个盘子借助A移到C
*/
if (1 == n)
printf("将第%d个圆盘从%c柱上移到%c柱上\n", n, A, C);
else
{
hanio(n-1, A, C, B);
printf("将第%d个圆盘从%c柱上移到%c柱上\n", n, A, C);
hanio(n - 1, B, A, C);
}
}
long Fibonacci(int n)
{
if (n<=1)
return 1;
else
return Fibonacci(n - 1) + Fibonacci(n - 2);
}