(新手向)中国大学mooc高级语言程序设计相关OJ解答(六)

中国大学mooc高级语言程序设计地址:https://www.icourse163.org/course/JLU-62001

第九讲:函数进阶 & 递归程序设计–编程题

1Hermite多项式(10分)

问题描述:编写程序,计算 Hermite 多项式值。Hermite 多项式定义如下。
在这里插入图片描述
输入:从键盘随机输入一个非负整数和一个实数,作为n和x的值。

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

样例1:输入 0 1.5 输出 1.00

样例2:输入 1 1.5 输出 3.00

样例3:输入 2 2.4 输出 21.04

样例4:输入 5 2.4 输出 624.20

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

直接数学描述下的递归练习。

2递归求解最大元素(10分)

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

输入:由键盘任意输入10个整数作为数组值。

输出:最大元素的值

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

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

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

#include<stdio.h>
int max(int a[],int n)//n作标记符标记递归中元素处于的位置
{
	int r;
	if(n>1){
		r=max(a,n-1);
		return r>a[n-1]?r:a[n-1];
	}
	else return a[0];
}
int main(){
	int a[10],i;
	for(i=0;i<10;i++)scanf("%d",&a[i]);
	printf("%d",max(a,10));
	return 0;
}

3输出正整数的各位数字(10分)

问题描述:编写递归函数,把正整数的各位数字依次打印输出

输入:任意一个正整数

输出:从高位开始依次输出正整数的各位数字,每位数占用一行。

样例2: 输入 13

输出1

3

#include<stdio.h>
void cal(int n){
	if(n>9){
		cal(n/10);
		printf("%d\n",n%10);
	}
	else printf("%d\n",n);
}
int main(){
	int n;
	scanf("%d",&n);
	cal(n);
	return 0;
}

注意数字输出顺序是从左到右。所以n>9中输出语句要在调用函数后面。

4递归求解字符串的长度(10分)

问题描述:编写递归函数,求给定字符串的长度。

输入:任意一个字符串(字符串中可能包含空格)

输出:输出字符串的长度

样例 : 输入Hello World! 输出12

#include<stdio.h>
char cal(char a[],int n){
	if(a[n]=='\0')return n;
	else return cal(a,n+1);
     
}

/*指针打法
char cal(char a[],int n){
	if(*a=='\0')return n;
	else return cal(a+1,n+1);    
}
*/
int main(){
	char a[100];
	gets(a);
	printf("%d",cal(a,0));
	return 0;
}

5递归查找指定数据(10分)

问题描述:编写递归函数,设已有升序整数数组a[N],并且数组中无重复元素。编写递归函数,使用对半检索方法在数组a中查找值为key的数组元素,如果找到key,函数返回元素在数组中的下标,如果未找到,函数返回-1。

输入:数组大小,数组元素,要查找的元素

输出:如果找到指定元素,输出对应的数组下标;如果未找到,输出-1。

样例: 输入 3

10 100 1000

100

输出 1

#include<stdio.h>
int lookfor(int a[],int head,int n,int key){
	int mid=(head+n)/2;
	if(head>n)return -1;
	if(key==a[mid])return mid;
	else return key>a[mid]?lookfor(a,mid+1,n,key):lookfor(a,head,mid-1,key);//a[mid]已经被检查,所以下次检查的边界要+1或-1
}

int main(){
	int a[100],n,i,key;
	scanf("%d",&n);
	for(i=0;i<n;i++)scanf("%d",&a[i]);
	scanf("%d",&key);
	printf("%d",lookfor(a,0,n-1,key));
	return 0;
	
}

第九讲:函数进阶 & 递归程序设计–编程题–拓展篇(不计入成绩)

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

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

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

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

样例: 输入 5

BJilin

AJilin

HJilin

IJilin

IJilinU

输出 IJilinU

#include <string.h>
#include <stdio.h>

char* StrMax(char StrArr[][100],int n){
	if(n==1) return *StrArr;
	return strcmp(*StrArr,StrMax(StrArr+1,n-1))>0?*StrArr : StrMax(StrArr+1,n-1);
}

char a[200][100];
int main(void){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%s",a[i]);
	}
	printf("%s",StrMax(a,n));
}

本方法无法通过用例3…问题待议
关于strcmp函数

#include<stdio.h>
int strcmp(char *p,char *q){
	while(*p!='\0'||*q!='\0'){
		if(*p>*q) return 1;
		if(*p<*q)return -1;
		p++;q++;
	}
	return 0;
}
int main(){
char a[100],b[100],*p=a,*q=b;
gets(a);
gets(b);
if(strcmp(p,q)==1)puts(a);
if(strcmp(p,q)==0)puts(a);
if(strcmp(p,q)==-1)puts(b);
return 0;
}

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

#include<stdio.h>
void JGFun(int InData,int *Nums){
	if(InData==1) {
	printf("1");
	printf("\n%d",*Nums);
}
	if(InData%2==0){
		printf("%d(除2)->",InData);
		JGFun(InData/2,++Nums);
	}
	else if(InData%2==1&&InData!=1)//注意排除1的情况,不然本函数不会结束(也可以改变两个if的嵌套关系)
	{
		printf("%d(乘3加1)->",InData);
		JGFun(InData*3+1,++Nums);
	}

}
int main(){
	int a[100],x,i;
	for(i=0;i<100;i++)a[i]=i;//指针计数,让元素内容为对应下标
	scanf("%d",&x);
	JGFun(x,a);
	return 0;
}
  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值