prolog,使用正确的算法,但得到了错误的答案

时间:2014-12-29 21:17:19

标签: prolog

我试图找到列表中的最大数字,甚至使用write()进行每次递归来验证我的步骤。这是我的代码

max(A,R):-
    maxx(A,1,R).

maxx([],R,R).
maxx([H|T],B,C):-
    (   H > B
    ->  C is H
    ;   C is B
    ),
    write(' maximmum of'),
    write(C),
    maxx(T,C,R1).

当我用问题max([3,2,4,1],A)运行它时,它给我这个输出。

maximmum is 3 maximmum is 3 maximmum is 4 maximmum is 4

A = 3.

但A应该是4而不是3,所以任何人都可以告诉我哪里弄错了。

1 个答案:

答案 0 :(得分:1)

问题在于此条款:

maxx([H|T],B,C):-
    (   H > B
    ->  C is H
    ;   C is B
    ),
    write(' maximmum of'),
    write(C),
    maxx(T,C,R1).

我想你看到了R1的单身警告。这是因为R1是您需要的真实结果,但您忽略了它,而是您的子句“返回”C,这是您的中间结果。您可以通过返回最终结果来解决此问题:

maxx([H|T], B, R):-
    (   H > B
    ->  C is H
    ;   C is B
    ),
    write(' maximmum of'),
    write(C),
    maxx(T, C, R).   % R is the final result that you want, not C

另外,您不希望使用is/2来等同(统一)Prolog中的两个变量。 is/2用于算术表达式求值和赋值。相反,请使用=/2进行统一:

maxx([H|T], B, R):-
    (   H > B
    ->  C = H
    ;   C = B
    ),
    write(' maximmum of'),
    write(C),
    maxx(T, C, R).   % R is the final result that you want, not C