第6週中級練習
注意,本週練習均是關於遞歸的,不用遞歸沒有意義(即使可以不用)。
注意,本週練習均是關於遞歸的,不用遞歸沒有意義(即使可以不用)。
注意,本週練習均是關於遞歸的,不用遞歸沒有意義(即使可以不用)。
依照學術誠信條款,我保證此作業是本人獨立完成的。
溫馨提示:
1.本次作業屬於Online Judge題目,提交後由系統即時判分。
2.學生可以在作業截止時間之前不限次數提交答案,系統將取其中的最高分作爲最終成績。
1遞歸插入排序(10分)
題目內容:
編寫函數,對整型數組進行遞歸插入排序。編寫函數,輸入、輸出數組元素。編寫主函數,調用函數輸入、排序、輸出元素。整數個數不超過100個。
輸入:在一行或多行中輸入若干用空隔開的整數,輸入-9999表示結束。
輸出:在一行中輸出整數,用一個空格隔開,末尾無空格。
輸入樣例:
3 2 1 5 4 -9999
輸出樣例:
1 2 3 4 5
時間限制:500ms內存限制:32000kb
C++
#include<iostream>
using namespace std;
int const N = 120;
int a[N];
void Insert(int a[], int n){
int i = n - 1;
int key = a[n];
while ((i >= 0) && (key < a[i]))
{
a[i + 1] = a[i];
i--;
}
a[i + 1] = key;
return;
}
void InsertionSort(int a[], int n){
if (n > 0)
{
InsertionSort(a, n - 1);
Insert(a, n);
}
else
return;
}
int main()
{
cin >> a[0];
int n = 0;
while (a[n] != -9999) {
cin >> a[++n];
}
InsertionSort(a, n-1);
cout << a[0];
for (int i = 1;i < n;i++)
{
cout << " " << a[i];
}
return 0;
}
用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 3ms 360kb
2
用例2通過 3ms 232kb
2
用例3通過 2ms 256kb
2
用例4通過 2ms 256kb
2
用例5通過 2ms 256kb
1
用例6通過 2ms 376kb
1
提交答案本次得分/總分:10.00/10.00分
2遞歸求兩個數的最大公因數(10分)
題目內容:
編寫函數,遞歸求兩個整數的最大公因數。編寫主函數,輸入兩個整數,調用函數求最大公因數,在主函數中輸出。
輸入:兩個正整數。
輸出:一個整數。
輸入輸出樣例:
輸入:
24 42
輸出:
6
時間限制:500ms內存限制:32000kb
C++
#include<iostream>
using namespace std;
int gcd(int x, int y);
int main(){
int x, y, z;
cin >> x >> y;
z = gcd(x, y);
cout << z;
}
int gcd(int x, int y){
if (x < y)
return gcd(y, x);
if (x%y == 0)
return y;
return gcd(y, x%y);
}
用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 3ms 256kb
2
用例2通過 3ms 256kb
2
用例3通過 2ms 240kb
2
用例4通過 2ms 364kb
1
用例5通過 2ms 240kb
1
用例6通過 3ms 372kb
1
用例7通過 2ms 256kb
1
提交答案本次得分/總分:10.00/10.00分
3全排列(10分)
題目內容:
編寫遞歸函數,顯示n個數字的全排列。例如,n=4,全排列爲
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 3 2
1 4 2 3
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 3 1
2 4 1 3
3 2 1 4
3 2 4 1
3 1 2 4
3 1 4 2
3 4 1 2
3 4 2 1
4 2 3 1
4 2 1 3
4 3 2 1
4 3 1 2
4 1 3 2
4 1 2 3
編寫主函數,輸入非負整數n,調用函數顯示全排列。
輸入格式:一個非負整數n.
輸出格式:全排列,每行一個,用一個空格隔開,末尾無空格。
輸入樣例:
4
輸出樣例:
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 3 2
1 4 2 3
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 3 1
2 4 1 3
3 2 1 4
3 2 4 1
3 1 2 4
3 1 4 2
3 4 1 2
3 4 2 1
4 2 3 1
4 2 1 3
4 3 2 1
4 3 1 2
4 1 3 2
4 1 2 3
時間限制:500ms內存限制:32000kb
C++
#include<iostream>
using namespace std;
//交換
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
//全排列遞歸算法
void Perm(int list[], int k, int m)
{
//list 數組存放排列的數,K表示層 代表第幾個數,m表示數組的長度
if (k == m)
{
//K==m 表示到達最後一個數,不能再交換,最終的排列的數需要輸出;
cout << list[1];
for (int i = 2;i <= m;i++)
cout << " "<<list[i];
cout << endl;
}
else {
for (int i = k;i <= m;i++)
{
swap(list[i], list[k]);
Perm(list, k + 1, m);
swap(list[i], list[k]);
}
}
}
int main(){
int n;
cin >> n;
int *a = new int[n];
for (int i = 1;i <=n;++i)a[i] = i;
Perm(a, 1, n);
}
用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 3ms 360kb
3
用例2通過 3ms 256kb
3
用例3通過 2ms 360kb
2
用例4通過 3ms 256kb
2
提交答案本次得分/總分:10.00/10.00分
4遞歸構造可重複字符串(10分)
題目內容:
編寫函數,使用遞歸的方法,遞歸地構造從順序的m個字母中抽取n個字母組成的所有字符串。例如,從4個字母中抽取3個組成的字符串爲:
AAA
AAB
AAC
AAD
ABA
ABB
ABC
ABD
ACA
ACB
ACC
ACD
ADA
ADB
ADC
ADD
BAA
BAB
BAC
BAD
BBA
BBB
BBC
BBD
BCA
BCB
BCC
BCD
BDA
BDB
BDC
BDD
CAA
CAB
CAC
CAD
CBA
CBB
CBC
CBD
CCA
CCB
CCC
CCD
CDA
CDB
CDC
CDD
DAA
DAB
DAC
DAD
DBA
DBB
DBC
DBD
DCA
DCB
DCC
DCD
DDA
DDB
DDC
DDD
編寫主函數,輸入整數m和n,調用函數顯示構造的字符串。
輸入格式:兩個整數,分別表示字符數和字符串的長度,用空格隔開。數據均小於10。
輸出格式:構造的字符串,每行一個,末尾無空格。
輸入樣例:
4 3
輸出樣例:
AAA
AAB
AAC
AAD
ABA
ABB
ABC
ABD
ACA
ACB
ACC
ACD
ADA
ADB
ADC
ADD
BAA
BAB
BAC
BAD
BBA
BBB
BBC
BBD
BCA
BCB
BCC
BCD
BDA
BDB
BDC
BDD
CAA
CAB
CAC
CAD
CBA
CBB
CBC
CBD
CCA
CCB
CCC
CCD
CDA
CDB
CDC
CDD
DAA
DAB
DAC
DAD
DBA
DBB
DBC
DBD
DCA
DCB
DCC
DCD
DDA
DDB
DDC
DDD
(題目來源於網絡)
時間限制:500ms內存限制:32000kb
C++
#include<iostream>
#include<cstring>
using namespace std;
int n, m;
void per(char buf[], char chs[],int len) {
if (len == m) {
cout<<buf<<"\n";
return;
}
for (int i = 0; i < n; i++) {
buf[len] = chs[i];
per(buf, chs, len+ 1);
}
}
int main(){
cin >> n >> m;
char a[100];
for (int i = 0;i < n;++i)a[i] = 'A' + i;
a[n] = '\0';
char b[100];
b[m] = '\0';
per(b, a, 0);
}
用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 2ms 368kb
2
用例2通過 3ms 372kb
2
用例3通過 3ms 368kb
2
用例4通過 3ms 368kb
2
用例5通過 2ms 376kb
1
用例6通過 15ms 368kb
1
提交答案本次得分/總分:10.00/10.00分
5自然數的拆分(10分)
題目內容:
給定自然數n,將其表示爲若干自然數的和,輸出所有的解。每組解從小到大排列。數字相同的不同排列算一組解。
輸入格式:一個自然數。
輸出格式:拆分式,每行一個。
輸入樣例:
4
輸出樣例:
4=1+1+1+1
4=1+1+2
4=1+3
4=2+2
4=4
(題目來源於網絡)
時間限制:500ms內存限制:32000kb
C++
#include<iostream>
using namespace std;
int a[41], s;
void print(int s) {
for (int i = 1;i <= s - 2;i++)cout<<a[i]<<"+";
cout<< a[s - 1]<<endl;
}
void search(int n, int s, int pre,int t) {
if (n == 0 && s > 2) {
cout << t << "=";
print(s);//打印
return;//返回
}
for (int i = pre;i <= n;i++) {
a[s] = i;//每一種
search(n - i, s + 1, i,t);//類似於遞歸,搜索下一種可能,若放滿則打印
}
}
int main() {
int n;
cin >> n;
search(n, 1, 1,n);
cout << n << "="<<n;
return 0;
}
用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 3ms 256kb
2
用例2通過 3ms 256kb
2
用例3通過 2ms 360kb
2
用例4通過 10ms 364kb
1
用例5通過 5ms 256kb
1
用例6通過 2ms 256kb
1
用例7通過 2ms 256kb
1
提交答案本次得分/總分:10.00/10.00分