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