中国大学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;
}