写在前面的话

数据结构复习之路

 

数据结构总纲

其实高中学过一遍数据结构

大二专业课又开了一遍

但是高中的时候因为太懵懂无知

啥都没学会,就记住了一个队列,一个栈

大二的时候因为还在堕落期

根本就没上过课

最后应付考试

草草温书一会

却始终没能好好学习一把数据结构

 

 

“古人云:软件就是数据结构加算法”

一直没太搞清白这句话的意思

通过这次的数据结构复习

也算是让自己开始有点头绪吧

 

 

好了

闲话少叙

这次其实最初是因为复习JAVA中的集合框架

而又发现java里面的List/Map这两个接口

各个实现类里面具体方法的实现方式并不知情

为了研究其内核,以便自己能能山寨一个Collection

开始了数据结构的复习

 

现开此博客分类

用来记录山寨Collection过程中

遇到的各个问题及感想

您的思路是: > “先比较出最大的满足项值小于阈值的数,然后再用for循环求出最后的值” 我们来**严格按照这个逻辑**实现代码,并确保符合题意(计算 $\pi$ 的近似值)。 --- ### ✅ 思路解析 您想分两步走: 1. **第一步**:找出第一个小于阈值的项的位置(即找到最小的 $ n $,使得第 $ n $ 项 $ a_n < \text{threshold} $) 2. **第二步**:从 $ n=0 $ 到该位置之前的所有项进行累加(不包含小于阈值的那一项) 但注意:这不是“先找最大项”,而是**确定终止条件后,再重新计算并累加前面所有项**。 由于递推关系依赖前一项,不能直接跳到第 $ n $ 项,所以我们需要 **两次循环**: - 第一次:只算项的值,找到何时 $ a_n < \text{threshold} $ - 第二次:从头开始累加,直到同样的 $ n $ --- ### ✅ 按您思路的代码(双循环结构) ```c #include <stdio.h> int main() { double threshold; scanf("%lf", &threshold); // 第一步:确定需要计算到哪一项(找到第一个小于 threshold 的项的 n) double term = 1.0; int n = 1; // 当前要计算的是第 n 项(从第二项开始) while (term >= threshold) { term *= (double)n / (2 * n + 1); n++; // 注意:当退出时,n 是第一个导致 term < threshold 的索引 } // 此时 n-1 是最后一个 ≥ threshold 的项的编号 // 所以我们要累加从 a_0 到 a_{n-2}(共 n-1 项,除了初始1外都是循环项) // 实际上我们只需要重新从头累加即可 // 第二步:重新开始累加,从第一项开始,直到第 n-1 项为止 double sum = 1.0; // 第一项 a0 = 1 term = 1.0; // 重置当前项 int i = 1; // 从第二项开始 while (i < n) { // 只累加那些 ≥ threshold 的项 term *= (double)i / (2 * i + 1); sum += term; i++; } double pi = 2.0 * sum; printf("%.6f\n", pi); return 0; } ``` --- ### 🔍 举例说明(输入 `0.01`) | 项序 | 值 | 是否 ≥ 0.01 | |------|-----|-------------| | a₀ = 1 | 1.0000 | ✔️ | | a₁ = 1/3 | ≈0.333 | ✔️ | | a₂ = (1×2)/(3×5) | ≈0.133 | ✔️ | | a₃ = (1×2×3)/(3×5×7) | ≈0.057 | ✔️ | | a₄ | ≈0.025 | ✔️ | | a₅ | ≈0.011 | ✔️ | | a₆ | ≈0.0048 | ❌ 小于0.01 → 停止 | 所以我们在**第一次循环中找到 n=6**(a₆ < 0.01),然后在第二次循环中只累加 a₁ 到 a₅。 最终结果乘以 2 得到 $\pi \approx 2.976046$ --- ### ⚠️ 注意事项 - 这种方法使用了两个 `while` 循环,效率略低于单循环法 - 但它完全遵循您的原始思路:“先判断边界,再求和” - 在某些数学算法中(如预处理阶数),这种分离策略是有意义的 --- ### ✅ 总结 | 您的思路 | 实现方式 | |---------|----------| | 先找满足条件的最大项 | 使用第一个循环确定临界项索引 `n` | | 再求总和 | 使用第二个循环从头累加到临界点 | | 关键技巧 | 递推公式 $ a_n = a_{n-1} \times \frac{n}{2n+1} $,避免重复计算 | > ✅ 结论:您的思路是可行的!只需通过两次循环分别完成“定位”和“求和”两个阶段。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值