mirror of
https://github.com/ParkMoonJ/KaoYan.git
synced 2026-11-05 07:08:26 +08:00
Update 3 栈和队列.md
This commit is contained in:
@@ -1,7 +1,5 @@
|
||||
# 第 3 章 栈和队列
|
||||
|
||||
[toc]
|
||||
|
||||
## 一、基本内容
|
||||
|
||||
栈和队列的结构特性;在两种存储结构上如何实现栈和队列的基本操作以及栈和队列在程序设计中的应用。
|
||||
@@ -345,27 +343,96 @@ $$
|
||||
### 3.25 试写出求递归函数 $F(n)$ 的递归算法,并消除递归:
|
||||
|
||||
$$
|
||||
F(n) = \begin{cases} n + 1 & n = 0 \\ n \cdot F(n / 2) & n > 0 \end{cases}
|
||||
F(n) =
|
||||
\begin{cases}
|
||||
n + 1 & n = 0 \\
|
||||
n \cdot F(n / 2) & n > 0
|
||||
\end{cases}
|
||||
$$
|
||||
|
||||
```cpp
|
||||
int function(int n) {
|
||||
if (n == 0) {
|
||||
return 1;
|
||||
} else {
|
||||
function(n / 2);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```cpp
|
||||
int function(int n) {
|
||||
while (n) {
|
||||
n = n / 2;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
```
|
||||
|
||||
### 3.26 求解平方根 $\sqrt{A}$ 的迭代函数定义如下:
|
||||
|
||||
$$
|
||||
sqrt(A, p, e) = \begin{cases} p & |p^2 - A| < e \\ sqrt(A, \frac{1}{2}(p + \frac{A}{p}), e) & |p^2 - A| \ge e\end{cases}
|
||||
sqrt(A, p, e) =
|
||||
\begin{cases}
|
||||
p & |p^2 - A| < e \\
|
||||
sqrt(A, \frac{1}{2}(p + \frac{A}{p}), e) & |p^2 - A| \ge e
|
||||
\end{cases}
|
||||
$$
|
||||
|
||||
### 其中,$p$ 是 $A$ 的近似平方根,$e$ 是结果允许误差。试写出相应的递归算法,并消除递归。
|
||||
|
||||
```cpp
|
||||
int function(int A, int p, int e) {
|
||||
if (abs(p * p - A) < e) {
|
||||
return p;
|
||||
} else {
|
||||
function(A, (p + A / p) / 2, e);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```cpp
|
||||
int function(int A, int p, int e) {
|
||||
while (p * p - A) >= e) {
|
||||
p = (p + A / p) / 2;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
```
|
||||
|
||||
### 3.27 已知 Ackerman 函数的定义如下:
|
||||
|
||||
$$
|
||||
akm(m, n) = \begin{cases} n + 1 & m = 0 \\ akm(m - 1, 1) & m \ne 0,n = 0 \\ akm(m - 1, akm(m, n - 1)) & m \ne 0,n \ne 0 \end{cases}
|
||||
akm(m, n) =
|
||||
\begin{cases}
|
||||
n + 1 & m = 0 \\
|
||||
akm(m - 1, 1) & m \ne 0,n = 0 \\
|
||||
akm(m - 1, akm(m, n - 1)) & m \ne 0,n \ne 0
|
||||
\end{cases}
|
||||
$$
|
||||
|
||||
#### (1)写出递归算法;
|
||||
|
||||
```cpp
|
||||
int akm(int m, int n) {
|
||||
if (!m) {
|
||||
return n + 1;
|
||||
} else {
|
||||
if (!n) {
|
||||
akm(m - 1, 1);
|
||||
} else {
|
||||
akm(m - 1, akm(m , n - 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### (2)写出非递归算法;
|
||||
|
||||
```cpp
|
||||
|
||||
```
|
||||
|
||||
#### (3)根据非递归算法,画出求 $akm(2, 1)$ 时栈的变化过程。
|
||||
|
||||
### 3.28 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队列和出队列的算法。
|
||||
|
||||
Reference in New Issue
Block a user