From dc321cd024108a427eb67a9232f425acfdb48328 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E5=A4=A7=E4=BB=99?= <1900919313@qq.com> Date: Thu, 17 Oct 2024 06:37:55 +0000 Subject: [PATCH] =?UTF-8?q?2024=E5=B9=B410=E6=9C=8817=E6=97=A5=2014:37?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/notes/02_c-leap/05_xdx/index.md | 60 ++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/docs/notes/02_c-leap/05_xdx/index.md b/docs/notes/02_c-leap/05_xdx/index.md index 47b5da0..564694a 100644 --- a/docs/notes/02_c-leap/05_xdx/index.md +++ b/docs/notes/02_c-leap/05_xdx/index.md @@ -1130,6 +1130,66 @@ int main() { * ② 在要求高性能的情况下尽量避免使用递归,递归调用既花时间又耗内存。 * ③ 可以考虑使用循环迭代来代替递归调用(与递归函数相比,迭代不但没有额外的内存开销,也没有额外的时间开销)。 + + +* 示例: + +```c +#include + +/** + * 使用循环来计算斐波那契数列 + * @param n + * @return + */ +int fib(int n) { + + // 出口条件 + if (n == 1 || n == 2) { + return 1; + } + + // 初识条件 a ,对应的是 fib(1) + int a = 1; + // 初识条件 b ,对应的是 fib(2) + int b = 1; + for (int i = 3; i <= n; ++i) { // 从 3 开始,因为 1 和 2 已经被计算过了 + // 计算当前斐波那契数,即:fib(n) = fib(n-1) + fib(n-2) + // a 表示前两个斐波那契数较小的,即:fib(n-2) + // b 表示前两个斐波那契数较大的,即:fib(n-1) + int temp = a + b; + // 更新 a 和 b 的值,为计算下一个斐波那契数做准备 + // 现在的 b,即 i - 1 项,变为了新的 a ,即新的 i-2 项 + a = b; + // 当前计算出的斐波那契数 temp,变为了新的 b ,即新的 i-1 项 + b = temp; + } + + return b; +} + +int main() { + + // 禁用 stdout 缓冲区 + setbuf(stdout, nullptr); + + int n = 1; + printf("第 %d 个斐波那契数是 %d\n", n, fib(n)); // 第 1 个斐波那契数是 1 + n = 2; + printf("第 %d 个斐波那契数是 %d\n", n, fib(n)); // 第 2 个斐波那契数是 1 + n = 3; + printf("第 %d 个斐波那契数是 %d\n", n, fib(n)); // 第 3 个斐波那契数是 2 + n = 4; + printf("第 %d 个斐波那契数是 %d\n", n, fib(n)); // 第 4 个斐波那契数是 3 + n = 5; + printf("第 %d 个斐波那契数是 %d\n", n, fib(n)); // 第 5 个斐波那契数是 5 + n = 6; + printf("第 %d 个斐波那契数是 %d\n", n, fib(n)); // 第 6 个斐波那契数是 8 + + return 0; +} +``` + ## 2.2 可变参数(了解) * 有的时候,函数参数的数量是不确定的,就可以使用 C 语言提供的`可变参数函数`,即:在声明可变参数函数的时候,使用省略号 `...` 来表示可变数量的参数。