查找最大值,需要列表的所有元素都是绝对值

Posted

技术标签:

【中文标题】查找最大值,需要列表的所有元素都是绝对值【英文标题】:Finding max, need all elements of list to be absolute value 【发布时间】:2021-04-01 18:59:07 【问题描述】:

这是我的代码,问题是,列表的最后一个元素不是绝对值。有人可以帮忙吗?

maxlist( [X], X ).
maxlist( [X,Y|Rest], AbsMax ) :-
  abs( [X], AbsX ),
  maxlist( [Y|Rest], AbsMaxRest ),
  max( AbsX, AbsMaxRest, AbsMax ).


max( X, Y, X ) :- X >= Y.
max( X, Y, Y ) :- X <  Y.

abs( [X], Y ) :-
  X < 0 -> Y is -X ; Y = X.

对于这样的列表:

maxlist( [-4110,-11,-885,-45,-154,-995] , X )

我得到X = 4110,但最后一项

maxlist( [-995,-11,-885,-45,-154,-4110], X )j

我得到了X = 995,而我应该得到4110

【问题讨论】:

现在解决了。 最大列表([X],X)。 maxlist([X,Y|Rest],AbsMax) :- abs(X,AbsX), abs(Y,AbsY), maxlist([AbsY | Rest],AbsMaxRest), max(AbsX,AbsMaxRest,AbsMax)。 max(X,Y,X) :- X>= Y. max(X,Y,Y) :- X Y 是 -X ; Y = X。 如果您已经解决了,请随时回答您自己的问题。甚至将其标记为已接受的答案(尽管您不会因此获得任何声誉积分)。这样做可以帮助其他人看到您的问题和解决方案。 【参考方案1】:

您的代码中的基本问题是列表的最后一个元素永远不会采用其绝对值。此外,您不需要为绝对值或最大值实现谓词:它们已被写入 Prolog。

Prolog 中的一个常见习惯用法是使用带有“私有”辅助谓词的公共谓词,该谓词接受一个或多个附加参数,这些参数携带计算所需的状态。这也有助于将事物转化为尾递归优化所需的形式,通过允许重用堆栈帧,将递归转换为简单的迭代。

试试这样的:

max_list( [X|Xs] , M ) :-     % to compute the maximum absolute value of a list ...
  A is abs( X ) ,             % * Pop the head of the list and take its absolute value, then...
  max_list( Xs, A, M ) .      % * Invoke the helper, seeding the accumulator with A

max_list( []     , M , M ) .  % If the source list is empty, we're done.
max_list( [X|Xs] , T , M ) :- % Otherwise...
  X1 is abs(X) ,              % * Take the absolute value of X
  T1 is max(X1,T) ,           % * Determine the max of X1 and T
  max_list(Xs, T1, M )        % * Recurse down with the remainder of the list and the new accumulator value
  .                           % Easy!

如果您需要自己弄清楚maxabs,这非常简单:


max( X , Y , Max ) :- X >  Y -> Max is X ; Max is  Y .
abs( X ,     Abs ) :- X >= 0 -> Abs is X ; Abs is -X .

【讨论】:

我的任务发生了一些变化。我还需要在 prolog 中实现 abs 和 max。我需要获取整数列表并判断 max 的 abs 值是否大于 min 的 abs 值。【参考方案2】:
maxlist([X],X).
maxlist([X,Y|Rest],AbsMax) :- 
abs(X,AbsX),
abs(Y,AbsY), 
maxlist([AbsY | Rest],AbsMaxRest),
max(AbsX,AbsMaxRest,AbsMax).
max(X,Y,X) :- X>= Y.
max(X,Y,Y) :- X < Y.
abs(X,Y) :- X < 0 -> Y is -X ; Y = X.

这解决了整个整数列表

【讨论】:

以上是关于查找最大值,需要列表的所有元素都是绝对值的主要内容,如果未能解决你的问题,请参考以下文章

如何在Matlab求绝对值

9内置方法

查找绝对定位元素的参考系

常见向量范数和矩阵范数

查找具有值范围的 k 个最大元素的有效算法

PYTHON学习0030:函数---内置方法----2019-6-23