PostgreSQL中如何结合evenfib表实现动态限制的偶斐波那契数求和
问题描述
我有一张名为evenfib的表,结构如下:
| id | n |
|---|---|
| 1 | 10 |
| 2 | 100 |
| 3 | 1000 |
需要计算所有小于给定数值n的偶斐波那契数的总和。已实现静态限制条件下的斐波那契序列求和,但不知如何结合evenfib表中的n值实现。使用PostgreSQL 13.0,现有静态代码如下:
WITH RECURSIVE fibonacci(prev_n, n) AS ( SELECT 0::bigint, 1::bigint UNION ALL SELECT n, prev_n + n AS fib FROM fibonacci WHERE n < 100 ) SELECT SUM(prev_n)::INT FROM fibonacci WHERE prev_n % 2 = 0
该代码返回结果44(不转换为INT时为0.44e2),运行正确,因为小于100的斐波那契序列是0 1 1 2 3 5 8 13 21 34 55 89,偶数之和为2+8+34=44。现在希望将第4行末尾的100替换为evenfib表中的各个n值。
解决方案
通过将递归CTE与evenfib表交叉关联,为每个n单独生成对应的斐波那契序列,再分组计算每个n对应的偶斐波那契数总和,具体SQL如下:
WITH RECURSIVE fibonacci(limit_n, prev_n, curr_n) AS ( -- 初始化:为evenfib中的每个n生成初始斐波那契对(0,1) SELECT e.n AS limit_n, 0::bigint, 1::bigint FROM evenfib e UNION ALL -- 递归生成斐波那契数,直到当前数curr_n小于对应的limit_n SELECT f.limit_n, f.curr_n, f.prev_n + f.curr_n FROM fibonacci f WHERE f.curr_n < f.limit_n ) -- 按limit_n分组,求和符合条件的偶斐波那契数 SELECT f.limit_n AS n, SUM(f.prev_n)::INT AS even_fib_sum FROM fibonacci f WHERE f.prev_n % 2 = 0 GROUP BY f.limit_n ORDER BY f.limit_n;
代码说明
- 递归CTE初始化:从
evenfib表中取出每个n作为limit_n,同时初始化斐波那契的前两个数prev_n=0、curr_n=1,每个n独立启动一条递归分支。 - 递归逻辑:每次迭代生成下一个斐波那契数,判断当前的
curr_n是否小于对应的limit_n,确保生成的数都小于目标值。 - 分组求和:按
limit_n(原表的n)分组,筛选出prev_n为偶数的记录并求和,得到每个n对应的结果。
执行结果
运行上述SQL后会得到如下结果:
| n | even_fib_sum |
|---|---|
| 10 | 10 |
| 100 | 44 |
| 1000 | 798 |
(注:小于10的偶斐波那契数为0、2、8,总和10;小于1000的偶斐波那契数为0、2、8、34、144、610,总和798)
内容的提问来源于stack exchange,提问作者mitwnkl
相关产品推荐
相关产品推荐

