You need to enable JavaScript to run this app. Prolog实现4000000以下所有偶数斐波那契数求和及错误代码修正
优惠活动
大模型
产品
解决方案
定价
更多

Prolog实现4000000以下所有偶数斐波那契数求和及错误代码修正

小于4000000的偶数斐波那契数总和计算(Prolog实现)

可直接运行的正确代码

% 递归遍历斐波那契序列,参数说明:
% 参数1: 当前遍历到的斐波那契值
% 参数2: 序列中下一个相邻的斐波那契值
% 参数3: 遍历上限
% 参数4: 偶数累加的中间缓存值
% 参数5: 最终返回的累加总和
sum_even_fib(Current, Next, Limit, Acc, Sum) :-
    Current =< Limit,
    % 判断当前值是否为偶数,更新累加缓存
    (   Current mod 2 =:= 0
    ->  NewAcc is Acc + Current
    ;   NewAcc = Acc
    ),
    % 递推到下一对斐波那契数
    NewNext is Current + Next,
    sum_even_fib(Next, NewNext, Limit, NewAcc, Sum).

% 递归终止条件:当前值超过上限,返回最终累加结果
sum_even_fib(Current, _, Limit, Acc, Acc) :-
    Current > Limit.

% 程序主入口
main :-
    % 从标准斐波那契序列起始值(F1=1, F2=1)开始遍历
    sum_even_fib(1, 1, 4000000, 0, Total),
    format('计算结果:所有小于4000000的偶数斐波那契数总和为 ~d~n', [Total]).

代码运行说明

  • 适配SWI-Prolog等主流Prolog运行环境,将代码写入.pl后缀文件后加载,在交互终端输入main.即可得到结果4613732
  • 递归遍历过程不会生成冗余的列表存储,内存占用极低,即使大幅上调遍历上限也可以正常运行

原编写代码的核心语法问题

  • 混用C语言语法规则:Prolog中没有&&逻辑与、+=自增运算符,算术等值比较需要用=:=,规则内的逻辑合取需要用,连接,不能直接套用其他语言的写法
  • 混淆符号语义:Prolog中%是单行注释的起始标识,不是取模运算符;==是项的结构等值比较,不是算术值的等值比较,写出来的判断逻辑会被直接当成语法注释忽略,甚至触发解析报错
  • 状态存储逻辑错误:零散定义A(1)、B(1)这类静态事实,无法在递归过程中动态更新斐波那契递推值、累计累加和,没有形成闭环的递归状态传递
  • 规则结构不符合Prolog语法规范::-是Prolog规则的定义标识,必须写在规则头之后、规则体之前,不能穿插在规则体中间位置,会直接触发语法解析错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 08:15:04