mirror of
https://github.com/renbaoshuo/202401-programming-assignments.git
synced 2024-11-23 09:38:42 +00:00
【实践课外】11.函数2
This commit is contained in:
parent
ec3c54f7d3
commit
c3a086d652
4
【实践课外】11.函数2/6-1 计算A[n]=1_(1 + A[n-1]).c
Normal file
4
【实践课外】11.函数2/6-1 计算A[n]=1_(1 + A[n-1]).c
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
float fun(int n) {
|
||||||
|
if (n == 1) return 1;
|
||||||
|
return 1.0 / (1.0 + fun(n - 1));
|
||||||
|
}
|
38
【实践课外】11.函数2/6-1 计算A[n]=1_(1 + A[n-1]).md
Normal file
38
【实践课外】11.函数2/6-1 计算A[n]=1_(1 + A[n-1]).md
Normal file
@ -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 <stdio.h>
|
||||||
|
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
|
||||||
|
|
||||||
|
```
|
8
【实践课外】11.函数2/6-2 递归实现顺序输出整数.c
Normal file
8
【实践课外】11.函数2/6-2 递归实现顺序输出整数.c
Normal file
@ -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);
|
||||||
|
}
|
42
【实践课外】11.函数2/6-2 递归实现顺序输出整数.md
Normal file
42
【实践课外】11.函数2/6-2 递归实现顺序输出整数.md
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
# 6-2 递归实现顺序输出整数
|
||||||
|
|
||||||
|
本题要求实现一个函数,对一个整数进行按位顺序输出。
|
||||||
|
|
||||||
|
### 函数接口定义:
|
||||||
|
```c++
|
||||||
|
void printdigits( int n );
|
||||||
|
```
|
||||||
|
函数`printdigits`应将`n`的每一位数字从高位到低位顺序打印出来,每位数字占一行。
|
||||||
|
|
||||||
|
### 裁判测试程序样例:
|
||||||
|
```c++
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
void printdigits( int n );
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
|
||||||
|
scanf("%d", &n);
|
||||||
|
printdigits(n);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 你的代码将被嵌在这里 */
|
||||||
|
```
|
||||||
|
|
||||||
|
### 输入样例:
|
||||||
|
```in
|
||||||
|
12345
|
||||||
|
```
|
||||||
|
|
||||||
|
### 输出样例:
|
||||||
|
```out
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
```
|
4
【实践课外】11.函数2/6-3 自然数的位数(递归).c
Normal file
4
【实践课外】11.函数2/6-3 自然数的位数(递归).c
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
int NumDigit(int number) {
|
||||||
|
if (number == 0) return 0;
|
||||||
|
return 1 + NumDigit(number / 10);
|
||||||
|
}
|
45
【实践课外】11.函数2/6-3 自然数的位数(递归).md
Normal file
45
【实践课外】11.函数2/6-3 自然数的位数(递归).md
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
# 6-3 自然数的位数(递归)
|
||||||
|
|
||||||
|
请编写函数,用递归方法求自然数的位数。
|
||||||
|
|
||||||
|
#### 函数原型
|
||||||
|
|
||||||
|
```
|
||||||
|
int NumDigit(int number);
|
||||||
|
```
|
||||||
|
|
||||||
|
说明:参数 number 为自然数。函数值为 number 的位数。若 number 为零,则函数值为零。
|
||||||
|
|
||||||
|
#### 裁判程序
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int NumDigit(int number);
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
scanf("%d", &n);
|
||||||
|
printf("%d\n", NumDigit(n));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 你提交的代码将被嵌在这里 */
|
||||||
|
```
|
||||||
|
|
||||||
|
要求:用递归方法完成函数的设计,不得使用循环语句。
|
||||||
|
|
||||||
|
#### 输入样例
|
||||||
|
|
||||||
|
```in
|
||||||
|
25173
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 输出样例
|
||||||
|
|
||||||
|
```out
|
||||||
|
5
|
||||||
|
|
||||||
|
```
|
25
【实践课外】11.函数2/6-4 分治法求解金块问题.c
Normal file
25
【实践课外】11.函数2/6-4 分治法求解金块问题.c
Normal file
@ -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;
|
||||||
|
}
|
59
【实践课外】11.函数2/6-4 分治法求解金块问题.md
Normal file
59
【实践课外】11.函数2/6-4 分治法求解金块问题.md
Normal file
@ -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 <stdio.h>
|
||||||
|
#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
|
||||||
|
```
|
11
【实践课外】11.函数2/6-5 汉诺塔.c
Normal file
11
【实践课外】11.函数2/6-5 汉诺塔.c
Normal file
@ -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);
|
||||||
|
}
|
85
【实践课外】11.函数2/6-5 汉诺塔.md
Normal file
85
【实践课外】11.函数2/6-5 汉诺塔.md
Normal file
@ -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<iostream>
|
||||||
|
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<<endl;
|
||||||
|
hanoi(n, 'A', 'B', 'C');
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
### 输入样例:
|
||||||
|
|
||||||
|
```in
|
||||||
|
3
|
||||||
|
4
|
||||||
|
```
|
||||||
|
|
||||||
|
### 输出样例:
|
||||||
|
|
||||||
|
```out
|
||||||
|
A->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
|
||||||
|
```
|
||||||
|
|
||||||
|
|
5
【实践课外】11.函数2/6-6 重复显示(递归).c
Normal file
5
【实践课外】11.函数2/6-6 重复显示(递归).c
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
void Show(int number, char symbol) {
|
||||||
|
if (number == 0) return;
|
||||||
|
printf("%c", symbol);
|
||||||
|
Show(number - 1, symbol);
|
||||||
|
}
|
47
【实践课外】11.函数2/6-6 重复显示(递归).md
Normal file
47
【实践课外】11.函数2/6-6 重复显示(递归).md
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
# 6-6 重复显示(递归)
|
||||||
|
|
||||||
|
请编写函数,重复显示字符。
|
||||||
|
|
||||||
|
#### 函数原型
|
||||||
|
|
||||||
|
```
|
||||||
|
void Show(int number, char symbol);
|
||||||
|
```
|
||||||
|
|
||||||
|
说明:参数 number 为自然数,symbol 为显示字符。函数将重复输出 number 个 symbol 字符。
|
||||||
|
|
||||||
|
#### 裁判程序
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
*****
|
||||||
|
|
||||||
|
```
|
9
【实践课外】11.函数2/6-7 平行四边形(右)(递归).c
Normal file
9
【实践课外】11.函数2/6-7 平行四边形(右)(递归).c
Normal file
@ -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);
|
||||||
|
}
|
62
【实践课外】11.函数2/6-7 平行四边形(右)(递归).md
Normal file
62
【实践课外】11.函数2/6-7 平行四边形(右)(递归).md
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
# 6-7 平行四边形(右)(递归)
|
||||||
|
|
||||||
|
请编写函数,显示平行四边形(右)。
|
||||||
|
|
||||||
|
#### 函数原型
|
||||||
|
|
||||||
|
```
|
||||||
|
void RtPara(int width, int height, char symbol);
|
||||||
|
```
|
||||||
|
|
||||||
|
说明:参数 width、height 为自然数,symbol 为显示字符。若参数正确,则函数将输出底宽为 width、高度为 height,由字符 symbol 组成的平行四边形(右),否则不输出。
|
||||||
|
|
||||||
|
### 裁判程序
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
********************
|
||||||
|
********************
|
||||||
|
********************
|
||||||
|
********************
|
||||||
|
********************
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
关联习题:重复显示(递归)。
|
19
【实践课外】11.函数2/7-2 N阶楼梯上楼问题.c
Normal file
19
【实践课外】11.函数2/7-2 N阶楼梯上楼问题.c
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
41
【实践课外】11.函数2/7-2 N阶楼梯上楼问题.md
Normal file
41
【实践课外】11.函数2/7-2 N阶楼梯上楼问题.md
Normal file
@ -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
|
||||||
|
```
|
Loading…
Reference in New Issue
Block a user