diff --git a/【实践课外】11.函数2/6-1 计算A[n]=1_(1 + A[n-1]).c b/【实践课外】11.函数2/6-1 计算A[n]=1_(1 + A[n-1]).c new file mode 100644 index 0000000..5088f1f --- /dev/null +++ b/【实践课外】11.函数2/6-1 计算A[n]=1_(1 + A[n-1]).c @@ -0,0 +1,4 @@ +float fun(int n) { + if (n == 1) return 1; + return 1.0 / (1.0 + fun(n - 1)); +} diff --git a/【实践课外】11.函数2/6-1 计算A[n]=1_(1 + A[n-1]).md b/【实践课外】11.函数2/6-1 计算A[n]=1_(1 + A[n-1]).md new file mode 100644 index 0000000..910188d --- /dev/null +++ b/【实践课外】11.函数2/6-1 计算A[n]=1_(1 + A[n-1]).md @@ -0,0 +1,38 @@ +# 6-1 计算A[n]=1/(1 + A[n-1]) + +函数 fun 的功能是:根据整型形参 n,计算某一数据项的值。 + A[1]=1, A[2]=1/(1 + A[1]), A[3]=1/(1 + A[2]), …,A[n]=1/(1 + A[n-1]) + 例如,若 n=10,则应输出:A10=0.617977。 + +### 函数接口定义: +```c++ +float fun(int n); +``` + +其中`n`是用户传入的参数,函数须返回第`n`项的值。 + +### 裁判测试程序样例: +```c++ +#include +float fun(int n); +int main( ) +{ int n ; + scanf("%d", &n ) ; + printf("A%d=%f\n", n, fun(n) ) ; + return 0; +} + + +/* 请在这里填写答案 */ +``` + +### 输入样例: +```in +10 +``` + +### 输出样例: +```out +A10=0.6180 + +``` diff --git a/【实践课外】11.函数2/6-2 递归实现顺序输出整数.c b/【实践课外】11.函数2/6-2 递归实现顺序输出整数.c new file mode 100644 index 0000000..d002d18 --- /dev/null +++ b/【实践课外】11.函数2/6-2 递归实现顺序输出整数.c @@ -0,0 +1,8 @@ +int _printdigits_call_cnt = 0; + +void printdigits(int n) { + if (n == 0 && _printdigits_call_cnt != 0) return; + _printdigits_call_cnt++; + printdigits(n / 10); + printf("%d\n", n % 10); +} diff --git a/【实践课外】11.函数2/6-2 递归实现顺序输出整数.md b/【实践课外】11.函数2/6-2 递归实现顺序输出整数.md new file mode 100644 index 0000000..48de01e --- /dev/null +++ b/【实践课外】11.函数2/6-2 递归实现顺序输出整数.md @@ -0,0 +1,42 @@ +# 6-2 递归实现顺序输出整数 + +本题要求实现一个函数,对一个整数进行按位顺序输出。 + +### 函数接口定义: +```c++ +void printdigits( int n ); +``` +函数`printdigits`应将`n`的每一位数字从高位到低位顺序打印出来,每位数字占一行。 + +### 裁判测试程序样例: +```c++ +#include + +void printdigits( int n ); + +int main() +{ + int n; + + scanf("%d", &n); + printdigits(n); + + return 0; +} + +/* 你的代码将被嵌在这里 */ +``` + +### 输入样例: +```in +12345 +``` + +### 输出样例: +```out +1 +2 +3 +4 +5 +``` diff --git a/【实践课外】11.函数2/6-3 自然数的位数(递归).c b/【实践课外】11.函数2/6-3 自然数的位数(递归).c new file mode 100644 index 0000000..99d441d --- /dev/null +++ b/【实践课外】11.函数2/6-3 自然数的位数(递归).c @@ -0,0 +1,4 @@ +int NumDigit(int number) { + if (number == 0) return 0; + return 1 + NumDigit(number / 10); +} diff --git a/【实践课外】11.函数2/6-3 自然数的位数(递归).md b/【实践课外】11.函数2/6-3 自然数的位数(递归).md new file mode 100644 index 0000000..ddac6f8 --- /dev/null +++ b/【实践课外】11.函数2/6-3 自然数的位数(递归).md @@ -0,0 +1,45 @@ +# 6-3 自然数的位数(递归) + +请编写函数,用递归方法求自然数的位数。 + +#### 函数原型 + +``` +int NumDigit(int number); +``` + +说明:参数 number 为自然数。函数值为 number 的位数。若 number 为零,则函数值为零。 + +#### 裁判程序 + +```c +#include + +int NumDigit(int number); + +int main() +{ + int n; + scanf("%d", &n); + printf("%d\n", NumDigit(n)); + return 0; +} + +/* 你提交的代码将被嵌在这里 */ +``` + +要求:用递归方法完成函数的设计,不得使用循环语句。 + +#### 输入样例 + +```in +25173 + +``` + +#### 输出样例 + +```out +5 + +``` diff --git a/【实践课外】11.函数2/6-4 分治法求解金块问题.c b/【实践课外】11.函数2/6-4 分治法求解金块问题.c new file mode 100644 index 0000000..ec3e70a --- /dev/null +++ b/【实践课外】11.函数2/6-4 分治法求解金块问题.c @@ -0,0 +1,25 @@ +int max(int a[], int m, int n) { + if (m == n) { + return a[m]; + } + + int mid = (m + n) / 2; + + int left_max = max(a, m, mid); + int right_max = max(a, mid + 1, n); + + return left_max > right_max ? left_max : right_max; +} + +int min(int a[], int m, int n) { + if (m == n) { + return a[m]; + } + + int mid = (m + n) / 2; + + int left_min = min(a, m, mid); + int right_min = min(a, mid + 1, n); + + return left_min < right_min ? left_min : right_min; +} diff --git a/【实践课外】11.函数2/6-4 分治法求解金块问题.md b/【实践课外】11.函数2/6-4 分治法求解金块问题.md new file mode 100644 index 0000000..4fc6115 --- /dev/null +++ b/【实践课外】11.函数2/6-4 分治法求解金块问题.md @@ -0,0 +1,59 @@ +# 6-4 分治法求解金块问题 + +老板有一袋金块(共n块,2≤n≤100),两名最优秀的雇员每人可以得到其中的一块,排名第一的得到最重的金块,排名第二的则得到袋子中最轻的金块。 + +输入一个正整数$$N$$($$2\le N\le 100$$)和$$N$$个整数,用分治法求出最重金块和最轻金块。 + +本题要求实现2个函数,分别使用分治法在数组中找出最大值、最小值。 + +### 函数接口定义: +```c++ +int max(int a[ ], int m, int n); +int min(int a[ ], int m, int n); +``` +递归函数`max`用分治法求出a[m]~a[n]中的最大值并返回。 + +递归函数`min`用分治法求出a[m]~a[n]中的最小值并返回。 + +### 裁判测试程序样例: +```c++ +#include +#define MAXN 101 + +int max(int a[ ], int m, int n); +int min(int a[ ], int m, int n); + +int main(void) +{ + int i, n; + int a[MAXN]; + + scanf ("%d", &n); + if(n >= 2 && n <= MAXN-1 ){ + for(i = 0; i < n; i++){ + scanf ("%d", &a[i]); + } + printf("max = %d\n", max(a, 0, n-1)); + printf("min = %d\n", min(a, 0, n-1)); + }else{ + printf("Invalid Value.\n"); + } + + return 0; +} + + +/* 请在这里填写答案 */ +``` + +### 输入样例: +```in +6 +3 9 4 9 2 4 +``` + +### 输出样例: +```out +max = 9 +min = 2 +``` diff --git a/【实践课外】11.函数2/6-5 汉诺塔.c b/【实践课外】11.函数2/6-5 汉诺塔.c new file mode 100644 index 0000000..e2b3ec6 --- /dev/null +++ b/【实践课外】11.函数2/6-5 汉诺塔.c @@ -0,0 +1,11 @@ +void hanoi(int n, char from, char to, char by) { + if (n == 1) { + printf("%c->%c\n", from, to); + + return; + } + + hanoi(n - 1, from, by, to); + printf("%c->%c\n", from, to); + hanoi(n - 1, by, to, from); +} diff --git a/【实践课外】11.函数2/6-5 汉诺塔.md b/【实践课外】11.函数2/6-5 汉诺塔.md new file mode 100644 index 0000000..3269f3c --- /dev/null +++ b/【实践课外】11.函数2/6-5 汉诺塔.md @@ -0,0 +1,85 @@ +# 6-5 汉诺塔 + +汉诺(Hanoi)塔问题是一个经典的递归问题。 + +设有A、B、C三个塔座;开始时,在塔座A上有若干个圆盘,这些圆盘自下而上,由大到小地叠在一起。要求将塔座A上的圆盘移到塔座B上,并仍按同样顺序叠放。在移动过程中要求遵守如下规则: +* 每次只能移动一个圆盘; +* 任何时刻都不允许将较大的圆盘压在较小的圆盘之上; +* 在满足前两条规则的前提下,可将圆盘移至A、B、C中任何一塔座上。 + +例如,3个圆盘的初始状态如下: + +![hanoi.png](~/d68d16f9-ba77-4edb-98b6-66348201a71a.png) + +则移动过程如下: +A->B +A->C +B->C +A->B +C->A +C->B +A->B + +要求实现一个递归函数,模拟输出$n(1<=n<=8)$个圆盘从塔座A借助塔座C移动到塔座B上的过程(用A->B表示将圆盘从A移到B,其他类似)。 + +### 函数接口定义: +```c++ +void hanoi(int n, char from, char to, char by); +``` +其中参数 `n`是圆盘数 、`from`是原来叠放圆盘的塔座 、`to`是最终叠放圆盘的塔座 、`by`是可借助的塔座。 + +### 裁判测试程序样例: +```c++ +#include +using namespace std; + +//将n个圆盘借助by从from移到to +void hanoi(int n, char from, char to, char by); + +//输入n,输出将原来在A上的n个圆盘借助C移动到B上的移动过程,控制到文件尾 +int main() { + int n, cnt=0; + while(cin>>n) { + cnt++; + if (cnt>1) cout<B +A->C +B->C +A->B +C->A +C->B +A->B + +A->C +A->B +C->B +A->C +B->A +B->C +A->C +A->B +C->B +C->A +B->A +C->B +A->C +A->B +C->B +``` + + diff --git a/【实践课外】11.函数2/6-6 重复显示(递归).c b/【实践课外】11.函数2/6-6 重复显示(递归).c new file mode 100644 index 0000000..5db22c5 --- /dev/null +++ b/【实践课外】11.函数2/6-6 重复显示(递归).c @@ -0,0 +1,5 @@ +void Show(int number, char symbol) { + if (number == 0) return; + printf("%c", symbol); + Show(number - 1, symbol); +} diff --git a/【实践课外】11.函数2/6-6 重复显示(递归).md b/【实践课外】11.函数2/6-6 重复显示(递归).md new file mode 100644 index 0000000..293ffa7 --- /dev/null +++ b/【实践课外】11.函数2/6-6 重复显示(递归).md @@ -0,0 +1,47 @@ +# 6-6 重复显示(递归) + +请编写函数,重复显示字符。 + +#### 函数原型 + +``` +void Show(int number, char symbol); +``` + +说明:参数 number 为自然数,symbol 为显示字符。函数将重复输出 number 个 symbol 字符。 + +#### 裁判程序 + +```c +#include + +void Show(int number, char symbol); + +int main() +{ + int n; + char s; + scanf("%d %c", &n, &s); + Show(n, s); + putchar('\n'); + return 0; +} + +/* 你提交的代码将被嵌在这里 */ +``` + +要求:用递归方法完成函数的设计,不得使用循环语句。 + +#### 输入样例 + +```in +5 * + +``` + +#### 输出样例 + +```out +***** + +``` diff --git a/【实践课外】11.函数2/6-7 平行四边形(右)(递归).c b/【实践课外】11.函数2/6-7 平行四边形(右)(递归).c new file mode 100644 index 0000000..4c199c4 --- /dev/null +++ b/【实践课外】11.函数2/6-7 平行四边形(右)(递归).c @@ -0,0 +1,9 @@ +void RtPara(int width, int height, char symbol) { + if (height <= 0 || width <= 0) return; + + Show(height - 1, ' '); + Show(width, symbol); + Show(1, '\n'); + + RtPara(width, height - 1, symbol); +} diff --git a/【实践课外】11.函数2/6-7 平行四边形(右)(递归).md b/【实践课外】11.函数2/6-7 平行四边形(右)(递归).md new file mode 100644 index 0000000..cb53424 --- /dev/null +++ b/【实践课外】11.函数2/6-7 平行四边形(右)(递归).md @@ -0,0 +1,62 @@ +# 6-7 平行四边形(右)(递归) + +请编写函数,显示平行四边形(右)。 + +#### 函数原型 + +``` +void RtPara(int width, int height, char symbol); +``` + +说明:参数 width、height 为自然数,symbol 为显示字符。若参数正确,则函数将输出底宽为 width、高度为 height,由字符 symbol 组成的平行四边形(右),否则不输出。 + +### 裁判程序 + +```c +#include + +void Show(int number, char symbol); +void RtPara(int width, int height, char symbol); + +int main() +{ + int w, h; + char s; + scanf("%d %d %c", &w, &h, &s); + RtPara(w, h, s); + putchar('\n'); + return 0; +} + +void Show(int number, char symbol) +{ + ...(略)... +} + +/* 你提交的代码将被嵌在这里 */ +``` + +要求:用递归方法完成函数的设计,不得使用循环语句。 + +提示:利用前面作业中的 Show 函数。 + +#### 输入样例 + +```in +20 5 * + +``` + +#### 输出样例 + +```out + ******************** + ******************** + ******************** + ******************** +******************** + + +``` + +关联习题:重复显示(递归)。 diff --git a/【实践课外】11.函数2/7-2 N阶楼梯上楼问题.c b/【实践课外】11.函数2/7-2 N阶楼梯上楼问题.c new file mode 100644 index 0000000..ec99dc4 --- /dev/null +++ b/【实践课外】11.函数2/7-2 N阶楼梯上楼问题.c @@ -0,0 +1,19 @@ +#include + +int n, f[105] = {1, 1}; + +int main() { + scanf("%d", &n); + + if (n == 1) { + printf("1\n"); + } else { + for (int i = 2; i <= n; i++) { + f[i] = f[i - 1] + f[i - 2]; + } + + printf("%d\n", f[n]); + } + + return 0; +} diff --git a/【实践课外】11.函数2/7-2 N阶楼梯上楼问题.md b/【实践课外】11.函数2/7-2 N阶楼梯上楼问题.md new file mode 100644 index 0000000..471ced0 --- /dev/null +++ b/【实践课外】11.函数2/7-2 N阶楼梯上楼问题.md @@ -0,0 +1,41 @@ +# 7-2 N阶楼梯上楼问题 + + +N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式。例如,当楼梯只有一阶时,只有一种方法;当楼梯有两阶时,可以每次跨一阶,跨两次,也可以每次跨两阶,跨一次,因此有两种方法。 + +### 输入格式: + +输入包括一个整数N,(1<=N<46)。 + +### 输出格式: + +输出当楼梯阶数是N时的上楼方式总数。 + +### 输入样例1: + + +```in +3 +``` + +### 输出样例1: + + +```out +3 +``` + + +### 输入样例2: + + +```in +4 +``` + +### 输出样例2: + + +```out +5 +```