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