实验07递归程序设计(2023级)吉林大学高级语言程序设计作业

请同学们先看提示,自行思考实践后无果再看通过代码。学习不要欺骗自己!!!

欢迎校友+q3023225096进行讨论交流

1.2.3.函数题照着公式写递归就行,是送分题,同学们一定要能够秒杀!

4.最大公因数(提示:大除小,小除余,以此类推)

题目编号 :Exp06-Basic04

题目名称:最大公因数

题目描述:编写程序,用递归方法求解m、n最大公约数。对正整数u和v 可以采用欧几里德辗转相除算法求它们的最大公因数,具体过程如下:

u% v → r~1~

v % r~1~ → r~2~

r~1~% r~2~ → r~3~

r~2~ % r~3~ → r~4~

   … …  

r~n-1~% r~n~ → r~n+1~=0

当余数r~n+1~=0时,计算过程结束,r~n~ 为正整数u 、v的最大公因数。


输入:从键盘随机输入两个正整数m和n。输出:最大公因数。

样例1:

输入: 12 15

输出: 3

样例2:

输入: 28 49

输出: 7

#include<stdio.h>
int f(int m, int n)
{
	if (m % n != 0)
		return f(n, m % n);
	else return n;
}
int main()
{
	int m, n;
	scanf("%d%d", &m, &n);
	if (m == n) printf("%d", m);
	else if (m > n) printf("%d", f(m, n));
	else printf("%d", f(n, m));
	return 0;
}

5. 顺序检索(提示:无)

题目编号:Exp06-Basic05,GJBook3-10-06

题目名称:顺序检索

题目描述:编写程序,用递归方法在整数组中进行顺序检索。

输入:

第一行输入一个正整数n(0<n≤100),表示数组的元素个数;

第二行依次输入n个整数,作为数组的元素;

第三行输入待检索的关键字。

输出:

如果数组中含有关键字,则输出其首次出现的位置(下标值较小的位置)否则输出NULL。

样例1:

输入: 8 0 2 3 4 5 9 10 8 3

输出: 2

样例2:

输入: 8 0 2 3 4 5 9 10 8 6

输出: NULL

#include<stdio.h>
int f(int* arr, int x, int i, int n)
{
	if (i > n - 1) return -1000;
	if (arr[i] != x) return 1 + f(arr, x, i + 1, n);
	else return 0;
}
int main()
{
	int arr[100] = { 0 }, n = 0, x = 0;;
	scanf("%d", &n);
	for (int j = 0; j < n; scanf("%d", &arr[j++]));
	scanf("%d", &x);
	if (f(arr, x, 0, n) >= 0) printf("%d", f(arr, x, 0, n));
	else printf("NULL");
	return 0;
}

6. 最大元素(提示:无)

题目编号:Exp06-Enhance01,GJBook3-10-05

题目名称:最大元素

题目描述:编写程序,用递归方法求解长度为n的整型数组中最大元素值。

输入:第一行输入一个正整数n(0<n≤100),表示数组的元素个数;第二行依次输入n个整数,作为数组的元素。

输出:最大元素的值。
样例1:

4 3 2 1 0

输出: 9

样例2:

输入: 10 0 1 2 3 4 5 6 7 8 9

输出: 9

#include<stdio.h>
int f(int* arr, int max, int i, int n)
{
	if (i > n - 1) return max;
	if (arr[i] > max) return f(arr, arr[i], i + 1, n);
	else return f(arr, max, ++i, n);
}
int main()
{
	int arr[100] = { 0 }, n = 0;
	scanf("%d", &n);
	for (int j = 0; j < n; scanf("%d", &arr[j++]));
	printf("%d", f(arr, arr[0], 1, n));
	return 0;
}

7.数组反序 (提示:倒着输出)

题目编号:Exp06-Enhance02

题目名称:数组反序

题目描述:编写程序,用递归方法反序数组。
输入:第一行输入一个正整数n(0<n≤100),表示数组的元素个数;第二行依次输入n个整数,作为数组的元素。

输出:顺次输出逆序后数组中元素,元素间以一个西文空格间隔,最后一个元素后无字符。
样例1:

输入: 8 0 2 3 4 5 9 10 8

输出: 8 10 9 5 4 3 2 0

样例2:

输入: 5 0 2 3 3 5

输出: 5 3 3 2 0

​#include<stdio.h>
void f(int* arr, int n)
{
	if (n >= 0)
	{
		printf(" %d", arr[n--]);
		f(arr, n);
	}
}
int main()
{
	int arr[100] = { 0 }, n = 0;
	scanf("%d", &n);
	for (int j = 0; j < n; scanf("%d", &arr[j++]));
	printf("%d", arr[n - 1]);
	f(arr, n - 2);
	return 0;
}

8. 截木条(提示:一个数加上0.5然后去掉小数部分即可实现四舍五入)

题目编号 :Exp06-Enhance03

题目名称:截木条

题目描述:

给定一个长度为n的木条,将其在大致2/5的位置截断,得到2个长度仍为整数的木条;如果新得到的木条的长度仍旧超过规定长度k,将继续按照上述方法处理得到的木条,直到所有木条的长度都不大于k。

编写程序,用递归方法计算一个长度为n的木条,当规定长度为k时,其经过上述截断过程会得到多少根木条。其中:n、k均为正整数,且假设木条截断所得短木条长度四舍五入为正整数,长木条长度为总长减去短木条长度。

输入:顺次从键盘输入两个正整数n和k。

输出:木条根数。

样例1:

输入: 20  4

输出: 7

样例2:

输入: 3 20

输出: 1

void f(int n, int k, int* i)
{
	if (n > k)
	{
		f((double)n * 2 / 5 + 0.5, k, i);
		f((n - (double)n * 2 / 5 + 0.5), k, i);
		(*i)++;
	}
}
#include<stdio.h>
int main()
{
	int n = 0, k = 0, i = 1;
	scanf("%d%d", &n, &k);
	f(n, k, &i);
	printf("%d", i);
	return 0;
}

9. 十进制转换任意进制(提示:可以用数组存放数字,然后反序输出,大于9的数字用大写字母表示)

题目编号 :Exp06-Enhance05,freshman-1022

题目名称:十进制转换任意进制

题目描述:编写程序,用递归方法将十进制的非负整数 N 转换为 b 进制数(2≤b≤36),其中字符、ASCII码值和数值之间的对应关系如下:

Exp06-Enhance05.jpg

输入:一行输入两个非负整数,分别是十进制的 N 和 b  ,其中 0 <=N <=2^31 ,2 <=b <= 36 。

输出:N 的 b 进制数。
 

样例1:

输入: 579 8

输出: 1103

样例2:

输入: 579 20

输出: 18J

#include<stdio.h>
void trs(int* arr, long long N, int b, int* i)
{
	if (N / b != 0)
	{
		arr[(*i)++] = N % b;
		trs(arr, N / b, b, i);
	}
	else arr[*i] = N % b;
}
int main()
{
	int arr[31] = { 0 },b,i=0;
	long long N;
	scanf("%lld%d", &N, &b);
	trs(arr, N, b, &i);
	for (; i >= 0; i--)
	{
		if (arr[i] < 10) printf("%d", arr[i]);
		else printf("%c", arr[i] + 55);
	}
	return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值