吉林大學超星MOOC高階語言程式設計 實驗06 遞迴程式設計(2020級)
吉林大學超星MOOC高階語言程式設計 實驗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>
#include <stdlib.h>
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);
}
int main(int argc, char *argv[]) {
int m,n;
scanf("%d %d",&m,&n);
printf("%d",c(m,n));
return 0;
}
2
題目編號:Exp06-Basic02,GJBook3-10-03
題目名稱:Hermite多項式
題目描述:編寫程式,用遞迴方法求解Hermite 多項式值。Hermite 多項式定義如下。
輸入:從鍵盤隨機輸入一個非負整數和一個實數,作為n和x的值。
輸出:Hn(x)的值,精確到小數點後2位。
樣例1:
輸入:
0 1.5
輸出:
1.00
樣例2:
輸入:
2 2.4
輸出:
21.04
我的答案:得分: 12.5分
#include <stdio.h>
#include <stdlib.h>
double H(double n,double x){
if(n==0.0) return 1.0;
if(n==1.0) return 2.0*x;
if(n>1.0) return (2.0*x*H(n-1.0,x)-2.0*(n-1.0)*H(n-2.0,x));
}
int main(int argc, char *argv[]) {
double x;
double n;
scanf("%lf %lf",&n,&x);
printf("%.2lf",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
我的答案:得分: 12.5分
#include <stdio.h>
#include <stdlib.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 argc, char *argv[]) {
int m;
int 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>
#include<stdlib.h>
int Greatest_Common_Divisor(int u, int v) //輾轉相除法實現函式
{
if (u > v) { //判斷a和b的大小,大的作為被除數,小的作為除數
if (u % v == 0) return v; //除到最後,如果餘數為0,就直接返回除數,即最大公約數
else return Greatest_Common_Divisor(v % u, u); //餘數不為0的話,將較小的數與餘數相除,用遞迴再傳給Maximum_Common_Factor函式
}
else {
if (v % u == 0) return u;
else return Greatest_Common_Divisor(u, v % u);
}
}
int main() {
int m, n;
scanf("%d %d", &m, &n);
printf("%d", Greatest_Common_Divisor(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>
#include<stdlib.h>
void Sequence_Search(int *arr,int key,int length,int time) {
if (arr[time] == key)printf("%d", time);
else if (arr[time] != key && length - 1 == time)printf("NULL");
else return Sequence_Search(arr, key, length, ++time);
}
int main() {
int* arr, length, key;
scanf("%d", &length);
arr = (int*)malloc(sizeof(int) *length);
for (int time = 0; time < length; time++) {
scanf("%d", &arr[time]);
}
scanf("%d", &key);
Sequence_Search(arr, key, length, 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>
#include<stdlib.h>
int max(int *arr,int n)
{
int temp;
if(n>1){
temp=max(arr,n-1);
return temp>arr[n-1]?temp:arr[n-1];
}
else return arr[0];
}
int main(){
int *arr,i,length;
scanf("%d",&length);
arr = (int*)malloc(sizeof(int) * length);
for(i=0;i<length;i++)scanf("%d",&arr[i]);
printf("%d",max(arr,length));
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>
#include<stdlib.h>
int Anti_Out(int* arr, int length) {
if (length > 1) {
int temp = arr[length - 1];
printf("%d ", temp);
//if (length != 1)printf(" ");
return Anti_Out(arr, length - 1);
}
else return arr[0];
}
int main() {
int length;
int* arr;
scanf("%d", &length);
arr = (int*)malloc(sizeof(int) * length);
for (int i = 0; i < length; i++) {
scanf("%d", &arr[i]);
}
printf("%d", Anti_Out(arr, length));
}
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>
#include<stdlib.h>
int Cutting_sticks(float length,int limit) {
if (length > limit) {
return Cutting_sticks((int)(length * 2 / 5 + 0.5), limit) + Cutting_sticks((int)(length * 3 / 5 + 0.5), limit);
}
else return 1;
}
int main() {
float length;
int limit;
scanf("%f %d", &length, &limit);
printf("%d", Cutting_sticks(length, limit));
}