Prolog递归实现LCM时变量未按常量递增的bug修复咨询
修复Prolog最小公倍数计算代码的方案
问题根因
原代码的核心缺陷是递归调用时直接修改了输入参数,丢失了两个输入数的原始基准值,每次递增是在当前值基础上翻倍,而非叠加原始固定值,因此会陷入死循环,永远无法得到符合整除条件的结果。
修改后的完整代码
% 对外暴露的LCM计算入口 lcm(A, B, X) :- A =:= B, X is A, !. lcm(A, B, X) :- % 传入原始A、B作为固定累加基准,启动辅助递归 lcm_helper(A, B, A, B, X). % 辅助递归谓词:参数依次为当前A值、当前B值、原始A基准、原始B基准、结果值 lcm_helper(CurrA, CurrB, _, _, CurrA) :- CurrA >= CurrB, CurrA mod CurrB =:= 0, !. lcm_helper(CurrA, CurrB, _, _, CurrB) :- CurrB > CurrA, CurrB mod CurrA =:= 0, !. lcm_helper(CurrA, CurrB, OrigA, OrigB, X) :- CurrA < CurrB, NewA is CurrA + OrigA, lcm_helper(NewA, CurrB, OrigA, OrigB, X). lcm_helper(CurrA, CurrB, OrigA, OrigB, X) :- CurrB < CurrA, NewB is CurrB + OrigB, lcm_helper(CurrA, NewB, OrigA, OrigB, X).
效果验证
查询lcm(16,10,X)会按照预期流程执行,最终返回X = 80,符合最小公倍数的计算要求。
内容的提问来源于stack exchange,提问作者adlofMerlin
相关产品推荐
相关产品推荐

