我试图找到列表中的最大数字,甚至使用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,所以任何人都可以告诉我哪里弄错了。
答案 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