吉林大学2020级超星高级语言程序设计作业实验06 递归程序设计

希望能和大家讨论。

1题目名称:排列组合

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

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

样例1:
输入:
4 1
输出:
4

样例2:
输入:
6 2
输出:
15

#include<stdio.h>
int c(int m, int n) {
    
    
	if (n < 0)
		return 0;
	else if (n == 0)
		return 1;
	else if (n == 1)
		return m;
	else if (m < 2 * n)
		return c(m, m - n);
	else
		return c(m - 1, n - 1) + c(m - 1, n);
}
int main() {
    
    
	int m, n;
	scanf("%d%d", &m, &n);
	printf("%d", c(m, n));
	return 0;
}

2题目名称:Hermite多项式

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

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

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

样例1:

输入:
0 1.5
输出:
1.00
样例2:

输入:
2 2.4
输出:
21.04

#include<stdio.h>
double H(double n, double x) {
    
    
	if (n == 0)
		return 1;
	else if (n == 1)
		return 2 * x;
	else
		return 2 * x * H(n - 1, x) - 2 * (n - 1) * H(n - 2, x);
}
int main() {
    
    
	double n, x;
	scanf("%lf%lf", &n, &x);
	printf("%.2lf", H(n, x));
	return 0;
}

3题目名称:Ackerman函数

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

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

输出:Ack(m, n)的值。

样例1:输入 2 3 输出 9

样例2:输入 3 2 输出 29

样例3:输入 0 3 输出 4

#include<stdio.h>
int Ack(int m, int n) {
    
    
	if (m == 0)
		return n + 1;
	else if (n == 0)
		return Ack(m - 1, 1);
	else if (m > 0 && n > 0)
		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题目名称:最大公因数

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

u% v → r1

v % r1 → r2

r1% r2 → r3

r2 % r3 → r4

… …

rn-1% rn → rn+1=0

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

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

样例1:

输入:
12 15
输出:
3
样例2:

输入:
28 49
输出:
7

#include<stdio.h>
int gcd(int u, int v) {
    
    
	int r = u % v;
	if (r != 0)
		r = gcd(v, r);
	else return v;
}
int main() {
    
    
	int u, v;
	scanf_s("%d%d", &u, &v);
	printf("%d", gcd(u, v));
	return 0;
}

5题目名称:顺序检索

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

输入:

第一行输入一个正整数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 index(int* a, int n, int x, int i) {
    
    
	if (i < n) {
    
    
		if (*(a + i) == x) return i;
		else  return index(a, n, x, i + 1);
	}
	else  return 101;
}
int main() {
    
    
	int a[100], i, n, x;
	scanf_s("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &a[i]);
	scanf("%d", &x);
	if (index(a, n, x, 0) == 101)
		printf("NULL");
	else
		printf("%d", index(a, n, x, 0));
	return 0;
}

这个101一言难尽,,请大佬指教

6题目名称:最大元素

题目描述:编写程序,用递归方法求解长度为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 maxele(int* a, int n, int tmp, int i) {
    
    
	if (i < n) {
    
    
		if (*(a + i) > tmp) tmp = *(a + i);
		return maxele(a, n, tmp, i + 1);
	}
	else return tmp;
}
int main() {
    
    
	int a[100], i, n;
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &a[i]);
	printf("%d", maxele(a, n, a[0], 0));
	return 0;
}

7题目名称:数组反序

题目描述:编写程序,用递归方法反序数组。

输入:第一行输入一个正整数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 reverse(int* a, int len) {
    
    
	if (len > 1) {
    
    
		int tmp = a[0];
		a[0] = a[len - 1];
		a[len - 1] = tmp;
		reverse(a + 1, len - 2);
	}
}
int main() {
    
    
	int n, a[100] = {
    
     0 }, i;
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &a[i]);
	reverse(a, n);
	printf("%d", a[0]);
	for (i = 1; i < n; i++)
		printf(" %d", a[i]);
	return 0;
}

8题目名称:截木条

题目描述:

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

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

输入:顺次从键盘输入两个正整数n和k(n>10,k>3)。

输出:木条根数。

样例1:

输入: 20 4
输出: 7
样例2:

输入: 3 20
输出: 1

#include<stdio.h>
int CS(int n, int k) {
    
    
	if (n <= k)  return 1;
	else   return CS((int)(n * 2 / 5+0.5), k) + CS(n - (int)(n * 2 / 5+0.5), k);//这里将n*2/5四舍五入再送入
}
int main() {
    
    
	int n, k;
	scanf("%d%d", &n, &k);
	printf("%d", CS(n, k));
	return 0;
}

感想:对递归的理解还需要进一步加强,欢迎讨论。

猜你喜欢

转载自blog.csdn.net/u010656213/article/details/110919530
今日推荐