中国大学MOOC 吉林大学 程序设计基础 第九讲:函数进阶与递归程序设计--编程题

目录

1.Hermite多项式(10分)

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

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

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

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


1.Hermite多项式(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>
float h(int,float);
int main(void)
{
    int a;
    float b,y;
    scanf("%d%f",&a,&b);
    y=h(a,b);
    printf("%.2f",y);
    return 0;
}
float h(int n,float x)
{
    if(n==0)
        return 1.0;
    else if(n==1)
        return 2*x;
    else
        return 2*x*h(n-1,x)-2*(n-1)*h(n-2,x);
}

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 f(int a[],int);
int g(int,int);
int main(void)
{
    int a[10],i;
    for(i=0;i<10;i++)
        scanf("%d",&a[i]);
    printf("%d",f(a,10));
    return 0;
}
int f(int *p,int n)
{
    if(n==0)
        return 0;
    return g(*p,f(p+1,n-1));
}
int g(int m,int n)
{
    if(m>n)
        return m;
    if(m<=n)
        return n;
}

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

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

输入:任意一个正整数

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

样例1: 输入 13      

输出 1

        3

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

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

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

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

输出:输出字符串的长度

样例 : 输入Hello World!          输出12

#include<stdio.h>
int f(char *);
int main(void)
{
    char a[100];
    gets(a);
    printf("%d",f(a));
    return 0;
}
int f(char *p)
{
    if(*p=='\0')
        return 0;
    return 1+f(p+1);
}

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

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

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

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

样例: 输入     3

         10 100 1000

         100

         输出    1

#include<stdio.h>
int f(int,int);
int a[1000],key;
int main(void)
{
    int i,n;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",a+i);
    scanf("%d",&key);
    printf("%d",f(0,n-1));
    return 0;
}
//t为起始,g为结尾;
//判断数组中是否存在key,如果存在返回下标,不存在返回-1;
int f(int t,int g)
{
    if(t-g>0)
        return -1;
    if(key==*(a+(t+g)/2))
        return (t+g)/2;
    if(key>*(a+(t+g)/2))
        return f((t+g)/2+1,g);
    if(key<*(a+(t+g)/2))
        return f(t,(t+g)/2-1);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值