c语言知识点温习-2-递归

关于递归要注意:
程序中要用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;
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值