如何修改Prolog代码实现回文数判定并输出符合条件的数值
没问题,我帮你调整这段Prolog代码,让它能输出你要的回文数(1、11、22…101这类)。先理清楚原代码的逻辑:你已经用rev/2实现了数字反转,现在就差在反转后对比X和C1,相等就打印的步骤了。
先看修改后的完整代码:
go(N):- % 如果不需要输出0,直接注释掉下面这两行就行 write(0), nl, go(0, N). go(_, 0):- !. go(A, C):- C1 is A + 1, rev(C1, X), % 核心判断:当反转后的X和原数C1相等时,打印该数 (X =:= C1 -> write(C1), nl ; true), NewC is C - 1, go(C1, NewC). rev(Q, E):- name(Q, Q1), reverse(Q1, E1), name(E, E1).
我做了这几个关键修改:
- 添加数值相等判断:用
(X =:= C1 -> write(C1), nl ; true)这个条件分支——Prolog里比较数值相等要用=:=(=是变量绑定,不是数值比较哦),当条件成立时打印回文数,否则执行true跳过(避免递归失败)。 - 去掉冗余代码:原代码里的
A1 is A完全没必要,直接用C1 is A + 1就可以得到下一个要检查的数。 - 可选控制是否输出0:原代码开头会打印0(0也是回文数),如果你的需求里不需要它,直接注释掉
go(N)里的write(0), nl就行。
测试一下:比如调用go(101).,就会输出0、1、2…9、11、22…99、101这些回文数;要是去掉0的输出,就会从1开始打印你要的那些数啦。
内容的提问来源于stack exchange,提问作者Zain Ali
相关产品推荐
相关产品推荐

