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

356

被折叠的 条评论
为什么被折叠?



