使用 Prolog 通过递归求出数字的除数

问题描述 投票:0回答:1

我想在Prolog中打印一个数字的除数,我编写了以下代码:

find_and_display_divisors(N) :-
    write('Divisors of '), write(N), write(':'), nl,
    find_divisors(N, 1).

find_divisors(N, D) :-
    D =< N,
    0 is N mod D,
    write(D), write(' '),
    NextD is D + 1,
    find_divisors(N, NextD).
find_divisors(_, _).

我遇到的问题是,当我用 find_and_display_divisors(8) 调用我的程序时,它只打印 1 2 true;但是,它缺少其他值,例如 4 和 8。我缺少什么?

谢谢

prolog
1个回答
0
投票

你不需要递归来解决这个问题。您正在从 1 数到 N:

?- _N = 8, between(1, _N, Div), 0 =:= _N rem Div.
Div = 1 ;
Div = 2 ;
Div = 4 ;
Div = 8.

并且不要使用 is/2 进行比较,而使用 =:=/2。它会让你大吃一惊:

?- 1 =:= sin(pi/2).
true.

?- 1 is sin(pi/2).
false.
© www.soinside.com 2019 - 2024. All rights reserved.