你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

吉林大学超星MOOC学习通高级语言程序设计 C++ 实验06 递归程序设计(2021级)

2021/12/15 8:02:51

目录

 1. 最大公因数 

2.Hermite多项式

3. Ackerman函数

4.排列组合

5. 最大元素

6. 数组反序

7. 十进制转换任意进制

8. 顺序检索


 1. 最大公因数 

题目编号 :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 <iostream>

using namespace std;

int gcd(int x, int y)
{
	if (y == 0)return x;
	else
		return gcd(y, x % y);
}

int main()
{
	int x, y;
	cin >> x >> y;

	cout << gcd(x, y);

	return 0;
}

 比较基础的一道题,利用辗转相除法求最大公约数

2.Hermite多项式

题目编号:Exp06-Basic02,GJBook3-10-03

题目名称:Hermite多项式

题目描述:编写程序,用递归方法求解Hermite 多项式值。Hermite 多项式定义如下。

GJBook3-10-03.jpg

输入:从键盘随机输入一个非负整数和一个实数,作为n和x的值。

输出:H~n~(x)的值,精确到小数点后2位。


样例1:

输入:
0  1.5
输出:
1.00

样例2:

输入:
2  2.4
输出:
21.04

#include <iostream>
#include <iomanip>
using namespace std;

double Hermite(int n,double x)
{
	if (n == 0)return 1;
	if (n == 1)return 2 * x;

	return 2 * x * Hermite(n - 1, x) - 2 * (n - 1) * Hermite(n - 2, x);

}

int main()
{
	int n;
	double x;
	cin >> n >> x;

	cout << fixed << setprecision(2) << Hermite(n, x);

	return 0;
}

特别注意Hermite函数的返回值类型是double ,递归直接按照给的公式写就行

3. Ackerman函数

题目编号: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 <iostream>

using namespace std;

int Ack(int m, int n)
{
	if (m == 0)return n + 1;
	if (n == 0)return Ack(m - 1, 1);

	return Ack(m - 1, Ack(m, n - 1));
}

int main()
{
	int m, n;
	cin >> m >> n;

	cout << Ack(m, n) << endl;


	return 0;
}

4.排列组合

题目编号:Exp06-Basic01,GJBook3-10-02

题目名称:排列组合

问题描述:编写程序求函数C(m,n)的值。

输入:从键盘随机输入一个自然数和一个非负整数,分别作为m和n的值(m≥n)。

输出:函数C(m,n)的值。

样例1:

输入:

4  1  

输出:

4

样例2:

输入:
6 2 
输出:
15

#include <iostream>

using namespace std;

int C(int m, int n)
{
	if (n < 0)return 0;
	if (n == 0)return 1;
	if (n == 1)return m;
	if (m < 2 * n)return C(m, m - n);
	if (m >= 2 * n)return C(m - 1, n - 1) + C(m - 1, n);

}

int main()
{
	int m, n;
	cin >> m >> n;
	cout << C(m, n);

	return 0;
}

注意C函数中m,n的相对位置 不要将两者搞混

5. 最大元素

题目编号: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 <iostream>

using namespace std;

int Max(int* a,int len)
{
	if (len == 1)return *a;
	if (a[len - 2] < a[len - 1])
		a[len - 2] = a[len - 1];
		return Max(a, len - 1);

}

int main()
{
	int n, * a;
	cin >> n;
	//a = new int[n];
	a = (int*)malloc(sizeof(int) * n);
	for (int i = 0;i < n;i++)
	{
		cin >> a[i];
	}
	cout << Max(a,n);

	return 0;
}

 哈哈哈哈哈哈哈,由于C语言里面没有new,所以一般使用malloc函数来动态分布a的内存

6. 数组反序

题目编号: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 <iostream>
#include <malloc.h>
using namespace std;

void Reverse(int* a,int len)
{
	if (len == 1)
		cout << a[len - 1];//不输出行末空格防止出错
	if (len > 1)
	{
		cout << a[len - 1]<<" ";
		Reverse(a, len - 1);
	}
}
int main()
{
	int n, * a;
	cin >> n;
	a = (int*)malloc(sizeof(int) * n);
	for (int i = 0;i < n;i++)
	{
		cin >> a[i];
	}
	Reverse(a, n);

	return 0;
}

 经测试,本题的Reverse也可以直接这样写

void Reverse(int* a,int len)
{
	if (len > 0)
	{
		cout << a[len - 1]<<" ";
		Reverse(a, len - 1);
	}
}

7. 十进制转换任意进制

题目编号 :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;

void trans(long long a, int b)
{  
    if (0 == a)
        return;
       trans(a / b, b);
        cout<< "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[a % b];          
}
int main()
{
    long long a;
    int b;
    cin >> a >> b;
    if (a == 0)cout << "0";
    else trans(a, b);

    return 0;
}

8. 顺序检索

题目编号: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 <iostream>

using namespace std;

int Search(int* a, int key, int len,int num)
{
	if (num == len)return -1;
	if (*(a + num) == key)return num;
	else
		return Search(a, key, len, num + 1); 
}

int main()
{
	int len, * a, key;
	cin >> len;
	a = new int[len];
	for (int i = 0;i < len;i++)
	{
		cin >> a[i];
	}
	cin >> key;
	int x = Search(a, key, len, 0);
	if (x == -1)cout << "NULL" << endl;
	else cout << x << endl;


	return 0;
}