C语言递归函数练习

这篇博客通过一系列递归函数练习,涵盖了C语言中递归的应用,包括阶乘计算、实数的n次方、输出整数序列、组合数求解、辗转相除法求最大公约数、走楼梯问题、汉诺塔、十进制转二进制、十进制转R进制、分梨问题和24点游戏的解决方案。每个问题都提供了详细的输入输出示例及解答。

Problem A:【递归】求阶乘

题目描述
利用递归函数求阶乘
本题要求实现1个自定义函数:求阶乘函数
函数接口定义:
long long fac(int);
裁判测试程序样例:
在这里插入图片描述

输入

输入正整数n(n<=20)
测试数据有多组,处理到输入结束

输出

每行一个输出结果。

样例输入

1
2
3
4
5

样例输出

1
2
6
24
120

答案

long long fac(int n){
	if(n==1) return 1;
	else return n*fac(n-1);
} 

Problem B:【递归】用递归求x的n次方

题目描述
本题要求实现1个自定义函数:求x的n次方(已知x为实数,n为自然数)。
函数接口定义:
double mypow(double,int);
裁判测试程序样例:
在这里插入图片描述

输入

从键盘,输入x,n,测试数据有多组,处理到文件结尾

输出

输出x的n次方,结果保留3位小数

样例输入

10 2
3 4
5.2 1

样例输出

100.000
81.000
5.200

答案

double mypow(double x,int n){
    if(n==0)
        return 1;
    else
        return x*mypow(x,n-1);
}

Problem C:【递归】输出m和n之间的所有整数

题目描述
本题要求实现一个递归函数:按照从小到大顺序输出m和n之间的所有整数(包括m和n)。
函数接口定义:
void print(int m,int n);
裁判测试程序样例:
在这里插入图片描述

输入

输入整数m和n(-10<=m<=10,-10<=n<=10);
测试数据有多组,处理到输入结束。

输出

按照从小到大顺序输出m和n之间的所有整数(包括m和n),2个整数之间用空格隔开;
每个输出占 1行。

样例输入

3 -3
-2 1
4 4

样例输出

-3 -2 -1 0 1 2 3
-2 -1 0 1
4

答案

void print(int m,int n){
	int d;
	if(m==n) printf("%d",m);
	else if(m>n){
		d=m;m=n;n=d;
		for(int i=m;i<n;i++){
			printf("%d ",i);
		}
		printf("%d",n);
	}
	else{
		for(int i=m;i<n;i++){
			printf("%d ",i);
		}
		printf("%d",n);
	}
}

Problem D:【递归】求组合数

题目描述
利用递归函数计算组合数
在这里插入图片描述
本题要求实现1个自定义函数:求组合数函数。
函数接口定义:
int comb(int m,int n);
裁判测试程序样例:
在这里插入图片描述

输入

测试数据有多组,处理到输入结束

输出

每行一个输出结果。

样例输入

6 3
5 1

样例输出

20
5

答案

int comb(int m,int n){
	if(n==m||n==0)
		return 1;
	else
		return comb(m-1,n)+comb(m-1,n-1);
}

Problem E:【递归】利用辗转相除法求最大公约数

题目描述
本题要求实现一个递归函数:利用辗转相除法求最大公约数。
函数接口定义:
int gcd(int a, int b);
裁判测试程序样例:
在这里插入图片描述
辗转相除法,是目前已知最古老的算法, 可追溯至公元前300年。
它首次出现于欧几里德(Euclidean)的《几何原本》(第VII卷,命题i和ii)中,在中国可以追溯至东汉时期的《九章算术》
辗转相除法计算两个正整数a和b的最大公约数,步骤描述如下:
(1) 如果b为0则最大公约数为a,算法结束
(2) 令r为a÷b所得余数
(3) 令a←b,b←r,并返回步骤(1)

输入

输入正整数a,b;
测试数据有多组,处理到输入结束。

输出

输出a和b的最大公约数,每个输出占1行。

样例输入

24 60
18 15
23 21

样例输出

12
3
1

答案

int gcd(int a,int b){
    int c,m,t;
    if(a < b){
        t = a;
        a = b;
        b = t;
    }
    c=a % b;
    while(c != 0){
        a = b;
        b = c;
        c = a % b;
    }
    return b;
}

Problem F:走楼梯

题目描述
楼梯有n级台阶,上楼可以一步上一阶,也可以一步上二阶。编一程序,计算共有多少种不同走法?
本题要求用递归算法实现。

输入

输入n(n<=50)

输出

输出走法的总数。

样例输入

3

样例输出

3

答案

#include <stdio.h>
#include <stdlib.h>
int f(int n);
int main(){
    int n,t;
    scanf("%d",&n);
    t=f(n);
    printf("%d",t);
    return 0;
}
int f(int n){
    long s;
    if(n==1)
        s=1;
    else if(n==2)
        s=2;
    else
        s=f(n-1)+f(n-2);
    return s;
}

Problem G:【递归】汉诺塔(Haono)问题

题目描述
汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的柱子A、B和C,A上面套着n个圆的金片, 最大的一个在底下,其余一个比一个小,依次叠上去, 庙里的众僧不倦地把它们一个个地从A柱搬到C柱上,规定可利用中间的一根B柱作为帮助, 但每次只能搬一个, 而且大的不能放在小的上面。 僧侣们搬得汗流满面,可惜当n很大时这辈子恐怕就搬不完了。
聪明的你还有计算机帮你完成,你能写一个程序帮助僧侣们完成这辈子的夙愿吗?
本题要求实现1个自定义函数,输出搬动金片的全过程。
函数接口定义:
//将n个圆盘从A柱移到C柱上去(借助B柱)
void move(int n,char a,char b,char c)
裁判测试程序样例:
在这里插入图片描述

输入

输入金片的个数n(n>=1并且n<=10),测试数据有多组,处理到文件结尾。

输出

输出搬动金片的全过程。每组输出结果后,都空一行,格式见样例输出。

样例输入

2
3

样例输出

move 1# from A to B
move 2# from A to C
move 1# from B to C

move 1# from A to C
move 2# from A to B
move 1# from C to B
move 3# from A to C
move 1# from B to A
move 2# from B to C
move 1# from A to C

答案

void move(int n,char a,char b,char c){
    if(n==1){
	    printf("move %d# from %c to %c\n",n,a,c);
		return;
	}
	move(n-1,a,c,b);
	printf("move %d# from %c to %c\n",n,a,c);
	move(n-1,b,a,c);
}

Problem H:【递归】十进制转二进制

题目描述
输入一个十进制数N(32位整数),将它转换成二进制数输出。
要求用递归函数实现,并提交该函数定义。
本题要求实现1个自定义函数:用递归算法将十进制转换成二进制并输出。
函数接口定义:
//输入一个十进制数,转换为2进制并输出
void decToBin(int);
裁判测试程序样例:
在这里插入图片描述

输入

输入数据包含多个测试实例,每个测试实例包含1个整数N(32位整数)。

输出

输出转换后的数,每个输出占1行。

样例输入

55
-23
42
-2

样例输出

110111
-10111
101010
-10

答案

#include <math.h>
void decToBin(int n){
	int i = 0,j = 0,b[32] = {0};
	    while (n){
	        b[i++] = n % 2;
	        n /= 2;
	}  
	printf("%d",b[i-1]);
	for (j = i - 2;j >= 0;j--){
	    printf("%d",abs(b[j]));
	}
	i = 0;
}

Problem I:【递归】十进制转成R进制

题目描述
输入一个十进制数N(32位整数),用递归算法将它转换成R(2<=R<=16)进制数输出。
要求用递归函数实现。
本题要求实现1个自定义函数:用递归算法将十进制转换成R进制并输出。
函数接口定义:
//输入一个十进制数,转换为R进制并输出
void decToR(int,int);
裁判测试程序样例:
在这里插入图片描述

输入

输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16)。

输出

输出转换后的数。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。

样例输入

23 12
-4 3

样例输出

1B
-11

答案

#include <string.h>
void decToR(int n,int r){
    if(n < 0){printf("-");n = -n;}
    if(n == 0){printf("0");}
    int c = 0,a[100],i;
    while(n){
        a[c] = (n % r);
        c++;
        n /= r;
    }
    for(i = c - 1;i >= 0;i--){
        if(a[i] >= 10) printf("%c",'A'+a[i]-10);
        else printf("%d",a[i]);
    }
}

Problem J:【递归】分梨

题目描述
阿布喜欢吃梨,有一天妈妈买了一筐梨子。小伙伴们来做客,他想和小伙伴们一起分享。现在他要把m个梨放到n个盘子里面 (我们允许有的盘子为空),你能告诉阿布有多少种分法吗?(请注意,如果有三个盘子,我们将5,1,1和1,1,5,视为同一种分法)
本题要求用递归函数实现
本题要求实现1个自定义函数。
函数接口定义:
//用递归算法求m个梨放在n个盘子里的方法总数
int f(int m,int n);
裁判测试程序样例:
在这里插入图片描述

输入

第一行是一个整数t,代表有t组样例。
第二行有两个整数M和N代表有M个梨和N个盘子。

输出

输出有多少种方法。

样例输入

1
7 3

样例输出

8

答案

int f(int m,int n)  {         
    if(n==1||m==0)  
            return 1;  
    if(m<n)        
            return f(m,m);  
    else  
            return f(m,n-1)+f(m-n,n);                 
}

Problem K:24点

题目描述
有一天阿布在玩24点,被天宝看见了,天宝就想到了这样一个问题:假设有N张卡片,上面写着1,2,3…N,是否可以用这些卡片组成24点呢?要求是只能使用加减乘除(整除),所有的卡片都必须用上,并且只能使用一次。如果可以组成24点,则输出"Yes",否则输出“No”。
假设N等于5,那么存在1×2×(3+4+5)=24

输入

测试数据的第一行输入一个数字T,表示接下去输入T组数据。 接下去T行,每一行输入一个N,意思如题目中所描述。 T≤30,n≤100000

输出

对于每组数据,输出一行"Yes"或者“No”

样例输入

2
3
4

样例输出

No
Yes

答案

#include<stdio.h>
int main(){
    int n,t;
    while(scanf("%d",&t)!=EOF){
        while(t--){
            scanf("%d",&n);
            if(n>=4) printf("Yes\n");
            else printf("No\n");
        }
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值