在编写递归程序时,一定要十分清楚递归何时结束,结束条件无法满足的递归程序将导致无穷递归。
利用n! = n*(n-1)*(n-2)*~*1,计算整数n的阶乘n!。
先采用迭代法编程计算n!,编写程序如下:
#include <stdio.h>
int main()
{
int n;
long result = 1;
printf("Input n:");
scanf("%d",&n);
for(int i = 1;i <= n;i++)
{
result *= i;
}
if(n >= 0)
{
printf("%d! = %ld\n",n,result);
}
return 0;
}
用递归的方法实现n!,编写程序如下:
#include <stdio.h>
long fact(long n);
int main()
{
int n;
long result = 1;
printf("Input n:");
scanf("%d",&n);
result = fact(n);
if(result != 0)
{
printf("%d! = %ld\n",n,result);
}
return 0;
}
long fact(long n)
{
if(n < 0)
{
return 0;
}
else if(n == 0||n == 1)
{
return 1;
}
else
{
return n*fact(n-1);
}
}
编程求解汉诺塔问题,用A、B、C表示三根木桩,1~n表示有n个盘子,最下面的盘子为第n个盘子,最上面的盘子为第1个盘子。首先输入盘子的个数,然后展示如何将第k(k的范围为1~n)个盘子由A木桩移动到B木桩上。
#include <stdio.h>
void Hannota(int n,char a,char b,char c);
void Move(int num,char from,char to);
int main()
{
int n;
printf("请输入盘子的个数n:");
scanf("%d",&n);
printf("The step of moving %2d disk:\n",n);
Hannota(n,'A','B','C');
return 0;
}
void Hannota(int n,char a,char b,char c)
{
if(n == 1)
{
Move(n,a,b);
}
else
{
Hannota(n-1,a,c,b);
Move(n,a,b);
Hannota(n-1,c,b,a);
}
}
void Move(int num,char from,char to)
{
printf("Move %d:from %c to %c\n",num,from,to);
}