递归:一个函数直接或者间接调用自己。
本文主要介绍递归的几个简单举例。
1、递归必须得有一个明确的终止条件;
2、该函数所处理的数据规模必须是递减的;
3、这个转化必须是可解的。
所有循环都可以由递归实现,而所有递归不一定都可由循环实现。
比较内容 | 优点 | 缺点 |
---|---|---|
递归 | 容易理解 | 速度慢、存储空间大 |
循环 | 速度快、存储空间小 | 不易理解 |
#include
int main(void)
{
int i;
int n;
int mult = 1;
printf("请输入要一个数:n = ");
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
mult = mult * i;
printf("%d的阶乘为%d\n", n, mult);
return 0;
}
#include
int factorial_recursive(int n)
{
if(1 == n)
return 1;
else
return factorial_recursive(n - 1) * n;
}
int main(void)
{
printf("%d\n", factorial_recursive(5));;
return 0;
}
#include
int main(void)
{
int i;
int sum = 0;
for(i = 0; i <= 100; ++i)
{
sum += i;
}
printf("%d\n", sum);
return 0;
}
#include
int sum_recursive(int n)
{
if(1 == n)
return 1;
else
return sum_recursive(n - 1) + n;
}
int main(void)
{
printf("%d\n", sum_recursive(100));
return 0;
}
如何把A上面的n个盘子借助B移动到C上,要求:
1、一次只能移动一个盘子;
2、移动过程中,大盘子永远不能放在小盘子上面。
if (1 == n)
直接将A上的盘子移到C上
else
{
先把A上面的前n-1个盘子从A借助C移动到B上;
将A上面的第n个盘子直接从A移动到C;
再将B上的n-1个盘子借助A移到C。
}
#include
void hannuota(int, char, char, char);
int main(void)
{
int n;
char ch1 = 'A';
char ch2 = 'B';
char ch3 = 'C';
printf("请输入A柱子上面盘子的个数:n = ");
scanf("%d", n);
hannuota(n, A, B, C);//第一个参数表示盘子的个数,第二个参数表示放盘子的柱子,第三个参数表示借助的柱子,第四个柱子表示要移到的柱子
return 0;
}
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);
}
}
[1]数据结构–郝斌link.