超星学习通 吉林大学 程序设计基础 实验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;elsereturn 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(m,?n)的值。
樣例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");elseprintf("%d",f(0));return 0; } int f(int m) {if(m==n)return -1;if(*(a+m)==key)return m;elsereturn 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");elsef(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);elseprintf("%c",x%y+55); }總結
以上是生活随笔為你收集整理的超星学习通 吉林大学 程序设计基础 实验07 递归程序设计(2022级)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python处理网络文字流,设置为utf
- 下一篇: 写了两个简单的小工具,文件夹文件操作的