超星学习通 吉林大学 程序设计基础 实验07 递归程序设计(2022级)

目录

1. 排列组合

2. Hermite多项式

3. Ackerman函数

4. 最大公因数

5. 顺序检索

6. 最大元素

7. 数组反序

8. 截木条

9. 十进制转换任意进制


1. 排列组合

题目编号:Exp06-Basic01,GJBook3-10-02

题目名称:排列组合

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

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

输出:函数C(m,n)的值。

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

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

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

 

2. Hermite多项式

题目编号:Exp06-Basic02,GJBook3-10-03

题目名称:Hermite多项式

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

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

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

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

样例2:输入:2  2.4  输出:21.04

#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);
}

3. Ackerman函数

题目编号:Exp06-Basic03,GJBook3-10-04

题目名称:Ackerman函数

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

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

输出:Ack(mn)的值。

样例1:输入 2 3  输出 9

样例2:输入 3 2  输出 29

样例3:输入 0 3  输出 4

#include<stdio.h>
int ack(int,int);
int main(void)
{
    int x,y;
    scanf("%d%d",&x,&y);
    printf("%d",ack(x,y));
    return 0;
}
int ack(int m,int n)
{
    if(m==0)
        return n+1;
    if(n==0)
        return ack(m-1,1);
    if(m>0&&n>0)
        return ack(m-1,ack(m,n-1));
}

 

4. 最大公因数

题目编号 :Exp06-Basic04

题目名称:最大公因数

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

u% v → r~1~

v % r~1~ → r~2~

r~1~% r~2~ → r~3~

r~2~ % r~3~ → r~4~

   … …  

r~n-1~% r~n~ → r~n+1~=0

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

输入:从键盘随机输入两个正整数m和n。

输出:最大公因数。

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

样例2:输入:28 49  输出:7

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

5. 顺序检索

题目编号:Exp06-Basic05,GJBook3-10-06

题目名称:顺序检索

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

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

 

6. 最大元素

题目编号:Exp06-Enhance01,GJBook3-10-05

题目名称:最大元素

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

 

7. 数组反序

题目编号:Exp06-Enhance02

题目名称:数组反序

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

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

 

8. 截木条

题目编号 :Exp06-Enhance03

题目名称:截木条

题目描述

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

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

输入:顺次从键盘输入两个正整数n和k。

输出:木条根数。

样例1:输入: 20  4

             输出: 7

样例2:输入: 3 20

             输出: 1

#include<stdio.h>
int f(int,int);
int main(void)
{
    int n,k;
    scanf("%d%d",&n,&k);
    printf("%d",f(n,k));
    return 0;
}
int f(int x,int y)
{
    if(x<=y)
        return 1;
    return f(x*2/5,y)+f(x-x*2/5,y);
}

 

9. 十进制转换任意进制

题目编号 :Exp06-Enhance05,freshman-1022

题目名称:十进制转换任意进制

题目描述:编写程序,用递归方法将十进制的非负整数 N 转换为 b 进制数(2≤b≤36),其中字符、ASCII码值和数值之间的对应关系如下:

输入:一行输入两个非负整数,分别是十进制的 N 和 b  ,其中 0 <=N <=2^31 ,2 <=b <= 36 。

输出:N 的 b 进制数。

样例1:输入: 579 8  输出: 1103

样例2:输入: 579 20  输出: 18J

#include<stdio.h>
void f(long long,int);
int main(void)
{
    long long n;
    int b;
    scanf("%lld%d",&n,&b);
    if(n==0)//很重要
        printf("0");
    else
        f(n,b);
    return 0;
}
void f(long long x,int y)
{
    if(x==0)
        return;
    f(x/y,y);
    if(x%y<=9)
    printf("%d",x%y);
    else
        printf("%c",x%y+55);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值