Prolog递归求除数代码异常:调用find_and_display_divisors(8)输出不完整
问题分析与修复方案
你的代码只处理了D是N的除数的情况,当D不是除数时,直接触发了第二个空的find_divisors(_, _).子句,导致递归提前终止,所以只打印出1、2就结束了。
修复后的代码
find_and_display_divisors(N) :- write('Divisors of '), write(N), write(':'), nl, find_divisors(N, 1). find_divisors(N, D) :- D > N, !. % D超过N时终止递归 find_divisors(N, D) :- 0 is N mod D, % 判定D是N的除数 write(D), write(' '), NextD is D + 1, find_divisors(N, NextD). find_divisors(N, D) :- NextD is D + 1, % D不是除数,直接递归下一个数 find_divisors(N, NextD).
代码说明
- 新增第一个
find_divisors子句,明确递归终止条件:当D > N时停止,!用来阻止回溯,避免后续子句被误触发。 - 第二个子句处理D是除数的场景:打印当前除数后,递归检查下一个数。
- 第三个子句处理D不是除数的场景:直接递归检查下一个数,不执行打印操作。
调用find_and_display_divisors(8)会输出:
Divisors of 8: 1 2 4 8 true
更简洁的实现方式
可以用Prolog内置的between/3生成候选除数,结合forall/2简化代码:
find_and_display_divisors(N) :- write('Divisors of '), write(N), write(':'), nl, forall(between(1, N, D), (0 is N mod D -> write(D), write(' ') ; true)).
内容的提问来源于stack exchange,提问作者Little
相关产品推荐
相关产品推荐

