对于递归的初学者要多画图分析哦!
先上最简单的求阶乘问题,如下
//如求n的阶乘
int fac(int n)
{
if (n <= 1)
return 1;
else
return n * fac(n - 1);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = fac(n);
printf("ret=%d\n", ret);
}
对于阶乘的理解想必大家不陌生,下面进一步看斐波那契数列问题,
话不多说,上代码
//求第n个斐波那契数列
//1 1 2 3 5 8 13....
// 递归算法:
int count = 0;
int Fib(int n)
{
if (n ==3)
count++;//用count计算一下第三个用了多少次。反映这种方式效率低
if (n <= 2)
return 1;
else
return Fib(n - 1) + Fib(n - 2);//数字一大就非常慢,很浪费时间空间
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d\n", ret);
printf("%d\n", count);
return 0;
}
当然了,也可以用循环效率更高
最后,汉诺塔问题需要大家画图分析,代码如下
#include<stdio.h>
int c = 0;
void move(char x, int n, char z)
{
printf("第%i步:将%i号盘从%c->%c\n", ++c, n, x, z);
}
void hanoi(int n, char x, char y, char z)
{
if (n == 1)
move(x, 1, z);
else
{
hanoi(n - 1, x, z, y);
move(x, n, z);
hanoi(n - 1, y, x, z);
}
}
void main()
{
int n;
while (printf("3个塔座为a、b、c,圆盘最初在a座,借助b座移到c座。请输入圆盘数:") != EOF) {
scanf("%d", &n);
hanoi(n, 'a', 'b', 'c');
}
}
希望大家能多多自己理解,会有很大收获!