吉林大学高级程序语言设计-中国大学MOOC-第九讲:函数进阶与递归程序设计--编程题--拓展篇(不计入成绩)

本文介绍了两个递归算法的实现,一是通过递归求解字符串数组中字典顺序最大的字符串,二是计算输入整数经过特定运算达到1所需的次数。示例代码分别展示了两种递归解决方案,并给出了相应的输入输出样例。这两个问题都涉及到递归在字符串比较和数学运算中的应用。
摘要由CSDN通过智能技术生成

1

递归求解最大字符串(10分)

问题描述:编写递归函数char* StrMax(char *StrArr[ ],int n),用递归方法求n个字符串中按ASCII字典顺序排序为最大的字符串。

输入:字符串个数n(最多不超过100个),n个字符串(每个字符串不超过99个字符)

输出:按ASCII字典排序最大的字符串

样例: 输入     5

BJilin

AJilin

HJilin

IJilin

IJilinU

输出    IJilinU

时间限制:500ms内存限制:32000kb

非递归

#include <stdio.h>
int str_cmp(char* str1, char* str2)
{
	do {
		if (*str1 > *str2)return 1;
		else if (*str1 < *str2)return -1;
	} while ((*(str1++) != '\0') && ( * (str2++) != '\0'));
	return 0;
}
char* StrMax(char* StrArr[], int n)
{
	char* temp;
	int i, j, k;
	for (int i = 0; i < n - 1; i++)
	{
		k = i;
		for (int j = i + 1; j < n; j++)
			if (str_cmp(StrArr[k], StrArr[j]) > 0)k = j;
		temp = StrArr[i];
		StrArr[i] = StrArr[k];
		StrArr[k] = temp;
	}
	return StrArr[n-1];
}
int main() {
	char str[100][100];
	char* str_p[100];
	int n, i = 0, temp; scanf("%d",&n); temp = n;
	while (temp--) {
		scanf("%s",str[temp]);
		str_p[temp] = str[temp];
	}
	printf("%s",StrMax(str_p, n));
	return 0;
}

12/7 update递归方法

#include <stdio.h>
int str_cmp(char* str1, char* str2)
{
	int len1 = 0, len2 = 0;
	char* temp1 = str1, * temp2 = str2;
	while (*temp1 != '\0')
	{
		len1++;
		temp1++;
	}
	while (*temp2 != '\0')
	{
		len2++;
		temp2++;
	}
	if (len1 > len2)return 1;
	else if (len1 < len2)return -1;
	else {

		do {
			if (*str1 > *str2)return 1;
		    else if (*str1 < *str2)return -1;
		} while ((*(str1++) != '\0') && (*(str2++) != '\0'));
	return 0;
	}
}
char* StrMax(char* StrArr[], int n)
{
	if (n == 1)return *StrArr;
	else {
		if (str_cmp(*StrArr, StrMax(StrArr+1,n-1)) > 0)return *StrArr;
		else return StrMax(StrArr + 1, n - 1);
	}
}
int main() {
	char str[100][100];
	char* str_p[100];
	int n, i = 0, temp; scanf("%d", &n); temp = n;
	while (temp--) {
		scanf("%s", str[temp]);
		str_p[temp] = str[temp];
	}
	printf("%s", StrMax(str_p, n));
	return 0;
}

细细品味字符指针数组的运用!同时修复了前文的小bug。

2

递归求解运算次数(10分)

问题描述:编写递归函数void JGFun(int InData,int *Nums)实现:输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过有限次运算后,可以得到自然数值1。求经过多少次可得到自然数1,并打印中间运算过程。InData为自然数,*Nums为运算次数,*Nums初值为0。

输入:任意一个大于0的整数

输出:依次输出中间运算过程中的数值,最后输出运算次数

样例3: 输入   3      
          输出   3(乘3加1)->10(除2)->5(乘3加1)->16(除2)->8(除2)->4(除2)->2(除2)->1
                    7
 

时间限制:500ms内存限制:32000kb

#include <stdio.h>
int c = 0;
void JGFun(int n,int *p) {
	if (n == 1)return;
	else if (n % 2 == 1) {
		c++;
		*p = n;
		*(p + 1) = 1;
		JGFun(3 * n + 1, p+2);
	}
	else {
		c++;
		*p = n;
		*(p + 1) = 0;
		JGFun(n / 2, p + 2);
	}
}
int main() {
	int n,ans[100];
	scanf("%d",&n);
	JGFun(n, ans);
	for (int i = 0; i < c * 2; i++)
	{
		if (ans[i] == 1)printf("(乘3加1)->");
		else if(ans[i] == 0)printf("(除2)->");
		else printf("%d", ans[i]);
	}
		
	printf("1\n%d", c);
	return 0;
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值