获取列表的最小值 [英] Getting the minimum value of a list
问题描述
我正在尝试查找列表的最小值(作为学习经验,因此没有min
).
I am trying to find the minimum value of a list (as a learning experience, so without min
).
我的方法如下:
minimo([X], X).
minimo([X,Y|Tail], N):-
(X > Y, minimo([Y,Tail], Y));
(X <= Y, minimo([X,Tail], X)).
这给了我以下错误:
语法错误:应为运算符
Syntax error: Operator expected
所以我的问题是:
- 是什么导致语法错误?
- 如果它确实能返回正确的值,我将在修复后亲自尝试,但这实际上是正确的方法吗?
谢谢.
推荐答案
程序中存在几个错误:
-
正如Joe Lehmann所指出的,
-
没有
'<='/2
.它必须是'=<'/2
.
as pointed out by Joe Lehmann, there is no
'<='/2
. It must be'=<'/2
.
以递归方式调用minimo/2
时,错误地构造了列表.代替[Y,Tail]
,使用[Y|Tail]
.否则,您将获得一个列表,其中一个列表是第二个元素.
when you call minimo/2
recursively, you construct the lists wrong. Instead of [Y,Tail]
use [Y|Tail]
. Otherwise, you get a list with a list as second element.
您将minimo/2
的递归调用的第二个参数绑定到Y
或X
.相反,它必须绑定到N
.否则,您的N
将永远不会被实例化.
you bind the second argument of the recursive call of minimo/2
to Y
or X
. Instead it must be bound to N
. Otherwise, your N
will never be instantiated.
您可以通过添加剪切或使用if-then-else('->'
+ ;
)来进一步改善程序:
You can improve your program further by adding cuts or using if-then-else ('->'
+ ;
):
minimo([X], X) :- !.
minimo([X,Y|Tail], N):-
( X > Y ->
minimo([Y|Tail], N)
;
minimo([X|Tail], N)
).
这篇关于获取列表的最小值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!