1. 程式人生 > 其它 >實驗06 遞迴程式設計(2020級)

實驗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;
}