1
0
mirror of https://github.com/renbaoshuo/202401-programming-assignments.git synced 2024-11-23 15:48:42 +00:00

【实践课外】11.函数2

This commit is contained in:
Baoshuo Ren 2024-11-22 17:14:26 +08:00
parent ec3c54f7d3
commit c3a086d652
Failed to extract signature
16 changed files with 504 additions and 0 deletions

View File

@ -0,0 +1,4 @@
float fun(int n) {
if (n == 1) return 1;
return 1.0 / (1.0 + fun(n - 1));
}

View 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
```

View 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);
}

View 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
```

View File

@ -0,0 +1,4 @@
int NumDigit(int number) {
if (number == 0) return 0;
return 1 + NumDigit(number / 10);
}

View 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
```

View 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;
}

View 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
```

View 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);
}

View 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
```

View File

@ -0,0 +1,5 @@
void Show(int number, char symbol) {
if (number == 0) return;
printf("%c", symbol);
Show(number - 1, symbol);
}

View 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
*****
```

View 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);
}

View 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
********************
********************
********************
********************
********************
```
关联习题:重复显示(递归)。

View 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;
}

View 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
```