递归定义:
一个函数自己直接或者间接调用自己(使用栈来实现)
递归边界
递归函数
举例
1、递归求阶乘(直接调用函数自己)
#include<stdio.h>
int jieC(int n)
{
if(n == 1) return 1;
else return n * jieC(n - 1);
}
int main(void)
{
int n;
scanf("%d", &n);
printf("%d",jieC(n));
return 0;
}
2、1+2+3+…+100的和
3、汉诺塔
/*伪算法*/
if(n > 1)
{
先把A柱子上的前n-1个盘子从A借助C移到B
将A柱子上的第n个盘子直接移到C
再将B柱子上的n-1个盘子借助A移到C
}
#include<stdio.h>
void hannuota(int n, char A, char B, char 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(void) {
int n;
scanf("%d", &n);
/*A借助B移到C*/
hannuota(n,'A', 'B', 'C');
getchar();
getchar();
return 0;
}
一个函数为什么可以调用自己?
递归满足三个条件:
- 递归必须得有一个明确的终止条件
- 该函数所处理的数据规模必须在递减
- 这个转化必须是可解的
循环和递归的关系:
- 所有的循环都可以用递归来实现
- 能用递归来实现的,但是不一定能用循环来实现
递归:易于理解,速度慢,存储空间大
循环:不易理解,速度快,浪费空间少