From 9f14a0ba082e2c9e9d9ae36a2cbd685530daab4a Mon Sep 17 00:00:00 2001 From: ParkMoonJ Date: Thu, 8 Apr 2021 21:05:04 +0800 Subject: [PATCH] =?UTF-8?q?Update=203=20=E6=A0=88=E5=92=8C=E9=98=9F?= =?UTF-8?q?=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 3 栈和队列/3 栈和队列.md | 77 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/3 栈和队列/3 栈和队列.md b/3 栈和队列/3 栈和队列.md index 2daef20..7320f94 100644 --- a/3 栈和队列/3 栈和队列.md +++ b/3 栈和队列/3 栈和队列.md @@ -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 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队列和出队列的算法。