吉林大学—实验06 递归程序设计(2021级)

1

题目编号: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 n, k;
int arr[100];
using namespace std;
int arr_find(int i)
{
	if (arr[i] == k)return i;
	else if (i == n)return -1;
	return arr_find(i + 1);
}
int main() {
	scanf("%d",&n);
	int i = 0;
	for (int i = 0; i < n; i++)scanf("%d",&arr[i]);
	scanf("%d",&k);
	if (arr_find(0) != -1)printf("%d",arr_find(0));
	else printf("NULL");
	return 0;
}

2

题目编号 :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 max(int a, int b)
{
	if (a > b)return a;
	else return b;
}
int gcd(int a, int b) {
	if (b == 0)return a;
	return gcd(b, a % b);
}
int main() {
	int a, b;
	scanf("%d%d", &a, &b);
	printf("%d",gcd(max(a, b), a+b-max(a,b)));
	return 0;
}

3

题目编号:Exp06-Basic03,GJBook3-10-04

题目名称:Ackerman函数

问题描述:编写程序,计算 Ackerman 函数值。Ackerman 函数定义如下

          

 

输入:从键盘随机输入两个非负整数,分别作为m和n的值。

输出:Ack(mn)的值。

样例1:输入 2 3  输出 9

样例2:输入 3 2  输出 29

样例3:输入 0 3  输出 4

#include <stdio.h>

int ack(int m, int n)
{
	if (!m)return n + 1;
	if (!n)return ack(m - 1, 1);
	else return ack(m - 1, ack(m, n - 1));
}
int main() {
	int m, n;
	scanf("%d%d", &m, &n);
	printf("%d", ack(m, n));
	return 0;
}

4

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

题目名称:最大元素

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

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

输出:最大元素的值。


样例1:

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

样例2:

输入:
10
0 1 2 3 4 5 6 7 8 9
输出:
9
#include <stdio.h>
int max_element(int* p, int n)
{
	if (n == 0)return -1;
	else {
		if (n == 1)
			return *p;
		else {
			if (*p > max_element(p + 1, n - 1))
			{
				return *p;
			}
			else {
				return max_element(p + 1, n - 1);
			}
		}
	}
}
int main() {
	int arr[100], n, temp;
	scanf("%d",&n);
	temp = n;
	while (n--)scanf("%d",&arr[n]);
	printf("%d", max_element(arr, temp));
	return 0;
}

6

题目编号 :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 <iostream>
using namespace std;
typedef long long ll;
ll N,b;
char ans[1000];
char getChar(ll n)
{
 if (n < 10)return n + '0';
 else return n - 10 + 'A';
}
int transform(ll n)
{
 int len=0;
 while (n > 0)
 {
 ans[len++] = getChar(n % b);
 n /= b;
 }
 return len;
}
int main() {
 cin >> N >> b;
 int len = transform(N);
 if (N)for (int i = len - 1; i >= 0; i--)cout << ans[i];
 else cout << "0";
 return 0;
}

递归方法

#include <stdio.h>
typedef long long ll;
using namespace std;
void dg(int x, int n) {
	if (x == 0)return;
	dg(x / n, n);
	if (x % n < 10)printf("%c",x%n+'0');
	else printf("%c",x % n - 10 + 'A');
}
int main() {
	int x, n;
	scanf("%d%d", &x, &n);
	if (x == 0)printf("%d", x);
	dg(x, n);
	return 0;
}

还有几道太简单了就不发了奥,要的话关注我

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值