关于递归要注意:
程序中要用if语句来控制,只有在某一条件成立时才继续执行递归调用,否则就不再继续,这样就不会出现无终止的递归调用。
第一道题:
输入一个正整数,用递归逆序输出这个数,比如输入一个数12345,那么输出结果应该是54321.
代码及运行结果如下:
#include <stdio.h>
void inverted(int a)
{
if(a<10)//这是这个递归函数结束的条件
printf("%d",a);
else
{
printf("%d",a%10);
inverted(a/10);
}
}
int main()
{
int a;
scanf("%d",&a);
inverted(a);
return 0;
}
运行结果的话,可以参考本题题干。
第二道题:
放苹果:m个同样的苹果放n个同样的盘子里,允许有盘子空着, 问有多少种放法。(注意:5 1 1和1 5 1是同一种放法 )
分析:有两种情况:
1)至少有一个盘子为空。此时放法种数与减去这些空盘子的放法种数相同。
2)所有盘子都不为空。此时可以从每个盘子里拿掉一个苹果而不影响放法种数。
当m<n时,满足第一种情况.
很好的算法: f(m, n) = f(m-n, n) + f(m, n-1)
f(m, n): 把m个苹果放到n个盘子中的方法数 f(m, n-1): 把m个苹果放到n-1个盘子中的方法数(其中至少有一个空盘子) f(m-n, n): 把m个苹果放到n个盘子中,而且每个盘子中都有苹果(先拿n个出来,等m-n个放好了,然后每个盘子放一个)
代码及运行结果如下:
#include<stdio.h>
int manners(int m,int n)
{
if(n==1||m==0)
return 1;
if(n>m)
return manners(m,m);
return manners(m,n-1)+manners(m-n,n);
}
int main()
{
int m,n;
scanf("%d %d",&m,&n);
printf("%d",manners(m,n));
return 0;
}
运行结果:
第三道题:
递归求输入的n个数中的最大值,并输出最大值
代码及运行结果如下:
#include<stdio.h>
int getMax(int n)
{
int num,result;
if(n==0)
return 0;
scanf("%d",&num);
result=getMax(n-1);
if(result>num)
num=result;
return num;
}
int main()
{
int n,max;
scanf("%d",&n);
max=getMax(n);
printf("%d",max);
return 0;
}
运行结果:(注意下图中第一行的数字代表上面代码中的n)
第四道题:
用递归求阶乘
代码及运行结果如下:
#include<stdio.h>
int factorials(int num)
{
if(num==1||num==0)
return 1;
return num*factorials(num-1);//n!=(n-1)!*n
}
int main()
{
int num,answer;
scanf("%d",&num);
answer=factorials(num);
printf("%d",answer);
return 0;
}
运行结果:
第五道题:
汉诺塔:如下图所示,有3根柱子分别命名为A,B,C,要把A柱子上的5片圆盘移到B柱子上。要求是在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。请设计程序并打印出移动过程。
分析:
为了更好的分析,我们不妨给5个圆盘命名,从上到下依次命名为1,2,3,4,5。应题目要求,要把A上的圆盘全部移到B上去,并且要遵守题目的要求,那么我们的思路是借助C把A柱最下面的一层5移到B上,此时A柱上一个圆盘都没有了,B柱上有一个圆盘5,那其余的圆盘肯定都在C柱上排列(因为移动过程要遵守题目要求,所以C柱上由上到下排列着圆盘1,2,3,4)。然后,我们需要把圆盘4通过一系列操作移到B柱的圆盘5上面,那么此时,题目不就相当于是把C柱上的4个圆盘借助A柱移到B上了吗,所以,递归出现。
代码及运行结果如下:
#include<stdio.h>
void move(int n, char A, char B, char C)
{
if (n == 1)//当A柱只有一个圆盘时,直接移到B柱上即可
printf("%d盘:%c->%c\n",n,A,B);
else
{
move(n - 1, A, C, B);//把上面n - 1个圆盘从A借助B移到C,为了接下来把A柱最底层的圆盘n移到B上
printf("%d盘:%c->%c\n",n, A, B);
move(n - 1, C, B, A);//递归,对照代码第18行(区别是:第18行代码是把A柱上的5个圆盘移到B柱上调用这个函数,而这一行的代码是把第8行代码移到C柱上的圆盘移到B柱上而调用的函数)
}
}
int main()
{
int n;//代表圆盘的个数(层数)
char A = 'A',B = 'B',C = 'C';//代表ABC三根柱子
scanf("%d", &n);
move(n, A, B, C);
return 0;
}
运行结果: