有一分数序列:
求出这个数列的前 20 项之和。
观察该分数序列,可以发现:
分子:2, 3, 5, 8, 13, 21, …
分母:1, 2, 3, 5, 8, 13, …
这实际上是斐波那契数列的相邻两项构成的分数:
设斐波那契数列为,满足递推关系:
那么第 项分数为:
验证:
第 1 项:
第 2 项:
第 3 项:
……
因此,该问题本质是:计算前 20 个连续斐波那契相邻项之比的和。
补充知识:这个分数序列的极限是著名的黄金比例。随着项数增加,每一项越来越接近黄金比例。
程序运行后输出前 20 项分数及其总和(保留小数):
2/1
3/2
5/3
8/5
13/8
21/13
34/21
55/34
89/55
144/89
233/144
377/233
610/377
987/610
1597/987
2584/1597
4181/2584
6765/4181
10946/6765
17711/10946
32.660263最终结果约为 32.660263
设当前分子为 fz,分母为 fm,初始时:
第一项应为 2/1
可从 fz = 2, fm = 1 开始,但更通用的做法是从斐波那契基础值 fz = 1, fm = 1 出发,在循环中先更新再使用。
在每次迭代中:
保存当前分母 temp = fm
新分母 = 原分子 → fm = fz
新分子 = 原分子 + 原分母 → fz = fz + temp
当前分数为 fz / fm,累加到总和
这正是斐波那契数列的生成过程。
public class Demo20 {
public static void main(String[] args) {
double fm = 1.0; // 分母(F_n)
double fz = 2.0; // 分子(F_{n+1})
double sum = 0.0;
for (int i = 0; i < 20; i++) {
System.out.println((int)fz + "/" + (int)fm);
sum += fz / fm;
// 更新下一项:(fz, fm) -> (fz + fm, fz)
double nextFz = fz + fm;
fm = fz;
fz = nextFz;
}
System.out.printf("前20项之和为:%.6f\n", sum);
}
}使用 double 替代 float 提高精度(float 仅约 7 位有效数字,20 项后可能有误差)
更清晰地体现“分子 = 前分子 + 前分母”的递推逻辑
使用 printf 格式化输出,便于阅读
此题是斐波那契数列的经典应用之一。
斐波那契数列最早由意大利数学家列奥纳多·斐波那契在 1202 年的《算盘书》中提出,最初用于描述兔子繁殖问题。
相邻斐波那契数之比趋近于黄金分割比,这一比例在艺术、建筑、自然界中广泛存在(如向日葵种子排列、鹦鹉螺壳螺旋等)。
本题虽简单,但融合了数列、递推、浮点运算、循环控制等多个编程与数学核心概念,是初学者理解算法思维的良好练习。