首页 > 解决方案 > Prolog - 在列表中查找最小元素

问题描述

我试图通过比较正方形来找到列表中的最小元素。我做了以下事情:

min_elem([Min],Min).
min_elem([Head | Tail], Min) :-
   min_elem(Tail, Tail_min),
   Min is min(Head ^ 2, Tail_min ^ 2).

它实际上适用于一些测试,但我在跟踪以下测试时注意到:

跟踪示例

因此,在它检查正方形之后,它将使用前一个。即,当 8^2 变为 64,然后变为 64^2。我怎样才能防止这种情况?谢谢!!!

标签: prolog

解决方案


如果我对您的理解正确,那么您想min_elem(XS,X)成为真实X的当且仅当XS.

基于这样的理解,有两个问题:

  1. 在您的基本情况下,您没有选择广场。

  2. 在您的递归情况下,您正在取尾部平方的最小值的平方。

要解决这些问题,请将基本情况中的最小值平方并删除递归情况中的平方:

min_elem([X],Min) :- Min is X ^ 2.
min_elem([Head | Tail], Min) :-
   min_elem(Tail, Tail_min),
   Min is min(Head ^ 2, Tail_min).

推荐阅读