You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中如何结合evenfib表实现动态限制的偶斐波那契数求和

问题描述

我有一张名为evenfib的表,结构如下:

idn
110
2100
31000

需要计算所有小于给定数值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;

代码说明

  1. 递归CTE初始化:从evenfib表中取出每个n作为limit_n,同时初始化斐波那契的前两个数prev_n=0、curr_n=1,每个n独立启动一条递归分支。
  2. 递归逻辑:每次迭代生成下一个斐波那契数,判断当前的curr_n是否小于对应的limit_n,确保生成的数都小于目标值。
  3. 分组求和:按limit_n(原表的n)分组,筛选出prev_n为偶数的记录并求和,得到每个n对应的结果。

执行结果

运行上述SQL后会得到如下结果:

neven_fib_sum
1010
10044
1000798

(注:小于10的偶斐波那契数为0、2、8,总和10;小于1000的偶斐波那契数为0、2、8、34、144、610,总和798)

内容的提问来源于stack exchange,提问作者mitwnkl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:52:48