You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:23:14