实验06 递归程序设计(2020级)

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 m,int n)
{
    if(n<0)
    return 0;
    else if(n==0)
    return 1;
    else if(n==1)
    return m;
    else if(m<2*n)
    return C(m,m-n);
    else
    return (C(m-1,n-1)+C(m-1,n));
}
int main()
{
    int m,n;
    scanf("%d%d",&m,&n);
    printf("%d",C(m,n));
    return 0;
}

2

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

题目名称:Hermite多项式

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

GJBook3-10-03.jpg

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

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

在这里插入图片描述

样例1:

输入:
0 1.5

输出:
1.00

样例2:

输入:
2 2.4

输出:
21.04

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

3

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

题目名称:Ackerman函数

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

在这里插入图片描述

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

输出:Ack(m, n)的值。

样例1:输入 2 3 输出 9

样例2:输入 3 2 输出 29

样例3:输入 0 3 输出 4

#include<stdio.h>
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));
}
int main()
{
    int m,n;
    scanf("%d%d",&m,&n);
    printf("%d",Ack(m,n));
    return 0;
}

4

题目编号 :Exp06-Basic04

题目名称:最大公因数

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

u% v → r1

v % r1 → r2

r1% r2 → r3

r2 % r3 → r4

… …

rn-1% rn → rn+1=0

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

输入:从键盘随机输入两个正整数m和n。输出:最大公因数。

样例1:

输入:
12 15

输出:
3

样例2:

输入:
28 49

输出:
7

#include<stdio.h>
int MaxCommonFactor(int m,int n)
{
    if(n==0)
    return m;
    else
    return MaxCommonFactor(n,m%n);
}
int main()
{
    int m,n;
    scanf("%d%d",&m,&n);
    printf("%d",MaxCommonFactor(m,n));
    return 0;
}

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 n,a[101];
int *p=a;
int index(int *pa,int target,int n)
{
    if(n>0)
    {
        if(*pa==target)
        return pa-p;
        else
        return index(pa+1,target,--n);
    }
    else
    return -1;
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    scanf("%d",&a[i]);
    int target;
    scanf("%d",&target);
    int num;
    num=index(a,target,n);
    if(num!=-1)
    printf("%d",num);
    else
    printf("NULL");
    return 0;
}

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 n,a[101];
int Maxnumber(int a,int b)
{
    if(a>b)
    return a;
    else
    return b;
}
int Max(int *pa,int n)
{
    if(n>0)
    {
        return Maxnumber(*pa,Max(pa+1,--n));
    }
    else
    return a[n-1];
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    scanf("%d",&a[i]);
    printf("%d",Max(a,n));
    return 0;
}

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>
int n,a[101];
int N;
void reverse(int *pa)
{
    if(n>N/2)
    {
        int middle=*(pa+n-1);
        *(pa+n-1)=*(pa+N-n);
        *(pa+N-n)=middle;
        n=n-1;
        reverse(&a[1]);
    }
}
int main()
{
    scanf("%d",&n);
    N=n;
    for(int i=1;i<=n;i++)
    scanf("%d",&a[i]);
    reverse(&a[1]);
    for(int k=1;k<=N;k++)
    if(k==1)
    printf("%d",a[k]);
    else
    printf(" %d",a[k]);
    return 0;
}

8

题目编号 :Exp06-Enhance03

题目名称:截木条

题目描述:

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

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

输入:顺次从键盘输入两个正整数n和k(n>10,k>3)。

输出:木条根数。

样例1:

输入: 20 4

输出: 7

样例2:

输入: 3 20

输出: 1

#include<stdio.h>
int count=1;
int Rounding(float a)
{
    if((a-int(a))<0.5)
    return int(a);
    else
    return int(a)+1;
}
int function(float n,float k)
{
    if(n>k)
    count++;
    float half1=Rounding(n*2/5);
    float half2=Rounding(n-half1);
    if(half1>k)
    function(half1,k);
    if(half2>k)    
    function(half2,k);
    if(half1<=k&&half2<=k)
    return count;
}
int main()
{
    float n,k;
    scanf("%f%f",&n,&k);
    printf("%d",function(n,k));
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值