吉林大学超星MOOC学习通高级语言程序设计 C++ 实验06 递归程序设计(2021级)
目錄
?1.?最大公因數?
2.Hermite多項式
3.?Ackerman函數
4.排列組合
5.?最大元素
6.?數組反序
7.?十進制轉換任意進制
8.?順序檢索
?1.?最大公因數?
題目編號 :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 <iostream>using namespace std;int gcd(int x, int y) {if (y == 0)return x;elsereturn gcd(y, x % y); }int main() {int x, y;cin >> x >> y;cout << gcd(x, y);return 0; }?比較基礎的一道題,利用輾轉相除法求最大公約數
2.Hermite多項式
題目編號:Exp06-Basic02,GJBook3-10-03
題目名稱:Hermite多項式
題目描述:編寫程序,用遞歸方法求解Hermite 多項式值。Hermite 多項式定義如下。
輸入:從鍵盤隨機輸入一個非負整數和一個實數,作為n和x的值。
輸出:H~n~(x)的值,精確到小數點后2位。
樣例1:
樣例2:
輸入: 2??2.4 輸出: 21.04 #include <iostream> #include <iomanip> using namespace std;double Hermite(int n,double x) {if (n == 0)return 1;if (n == 1)return 2 * x;return 2 * x * Hermite(n - 1, x) - 2 * (n - 1) * Hermite(n - 2, x);}int main() {int n;double x;cin >> n >> x;cout << fixed << setprecision(2) << Hermite(n, x);return 0; }特別注意Hermite函數的返回值類型是double ,遞歸直接按照給的公式寫就行
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 <iostream>using namespace std;int Ack(int m, int n) {if (m == 0)return n + 1;if (n == 0)return Ack(m - 1, 1);return Ack(m - 1, Ack(m, n - 1)); }int main() {int m, n;cin >> m >> n;cout << Ack(m, n) << endl;return 0; }4.排列組合
題目編號:Exp06-Basic01,GJBook3-10-02
題目名稱:排列組合
問題描述:編寫程序求函數C(m,n)的值。
輸入:從鍵盤隨機輸入一個自然數和一個非負整數,分別作為m和n的值(m≥n)。
輸出:函數C(m,n)的值。
樣例1:
輸入:
4? 1??
輸出:
4
樣例2:
輸入: 6?2? 輸出: 15 #include <iostream>using namespace std;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 m, n;cin >> m >> n;cout << C(m, n);return 0; }注意C函數中m,n的相對位置?不要將兩者搞混
5.?最大元素
題目編號:Exp06-Enhance01,GJBook3-10-05
題目名稱:最大元素
題目描述:編寫程序,用遞歸方法求解長度為n的整型數組中最大元素值。
?
輸入:第一行輸入一個正整數n(0<n≤100),表示數組的元素個數;第二行依次輸入n個整數,作為數組的元素。
輸出:最大元素的值。
樣例1:
樣例2:
輸入: 10 0?1?2?3?4?5?6?7?8?9 輸出: 9 #include <iostream>using namespace std;int Max(int* a,int len) {if (len == 1)return *a;if (a[len - 2] < a[len - 1])a[len - 2] = a[len - 1];return Max(a, len - 1);}int main() {int n, * a;cin >> n;//a = new int[n];a = (int*)malloc(sizeof(int) * n);for (int i = 0;i < n;i++){cin >> a[i];}cout << Max(a,n);return 0; }?哈哈哈哈哈哈哈,由于C語言里面沒有new,所以一般使用malloc函數來動態分布a的內存
6.?數組反序
題目編號:Exp06-Enhance02
題目名稱:數組反序
題目描述:編寫程序,用遞歸方法反序數組。
輸入:第一行輸入一個正整數n(0<n≤100),表示數組的元素個數;第二行依次輸入n個整數,作為數組的元素。
輸出:順次輸出逆序后數組中元素,元素間以一個西文空格間隔,最后一個元素后無字符。
樣例1:
樣例2:
輸入: 5 0?2?3?3?5 輸出: 5?3?3?2?0 #include <iostream> #include <malloc.h> using namespace std;void Reverse(int* a,int len) {if (len == 1)cout << a[len - 1];//不輸出行末空格防止出錯if (len > 1){cout << a[len - 1]<<" ";Reverse(a, len - 1);} } int main() {int n, * a;cin >> n;a = (int*)malloc(sizeof(int) * n);for (int i = 0;i < n;i++){cin >> a[i];}Reverse(a, n);return 0; }?經測試,本題的Reverse也可以直接這樣寫
void Reverse(int* a,int len) {if (len > 0){cout << a[len - 1]<<" ";Reverse(a, len - 1);} }7.?十進制轉換任意進制
題目編號 :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 <iostream>using namespace std;void trans(long long a, int b) { if (0 == a)return;trans(a / b, b);cout<< "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[a % b]; } int main() {long long a;int b;cin >> a >> b;if (a == 0)cout << "0";else trans(a, b);return 0; }8.?順序檢索
題目編號: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 <iostream>using namespace std;int Search(int* a, int key, int len,int num) {if (num == len)return -1;if (*(a + num) == key)return num;elsereturn Search(a, key, len, num + 1); }int main() {int len, * a, key;cin >> len;a = new int[len];for (int i = 0;i < len;i++){cin >> a[i];}cin >> key;int x = Search(a, key, len, 0);if (x == -1)cout << "NULL" << endl;else cout << x << endl;return 0; }總結
以上是生活随笔為你收集整理的吉林大学超星MOOC学习通高级语言程序设计 C++ 实验06 递归程序设计(2021级)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.怎样定制VC#DataGrid列标题
- 下一篇: verycd重整——CBT系列