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
相关产品推荐
相关产品推荐

