Два определения пункта для нахождения максимального количества в списке

GC делает большую оптимизацию на том, когда правильно завершить вещи.

Поэтому, если Вы не знакомы с тем, как GC на самом деле работает и как он отмечает поколения, вручную вызов завершает или запускается, GC'ing, вероятно, повредит производительность, чем справка.

6
задан Taylor 29 November 2009 в 17:04
поделиться

2 ответа

Как и вы, я использую имя «max» для предиката. Эта реализация не полагается на какой-либо встроенный предикат:

max([X],X).
max([X|Xs],X):- max(Xs,Y), X >=Y.
max([X|Xs],N):- max(Xs,N), N > X.
10
ответ дан 8 December 2019 в 14:43
поделиться

Синтаксическая ошибка возникает из-за того, что первые два предложения не имеют тела.

Чтобы ответить на ваш вопрос, обратите внимание, что максимум списка может быть определен индуктивно следующим образом:

  • Максимум списка с одним элементом - это этот элемент.
  • Максимум списка с несколькими элементами является наибольшим из заголовка и максимума хвоста.

Таким образом,

max_list([H], H).
max_list([H|T], M2) :- 
  max_list(T, M),
  M2 is max(H, M).

Этот код использует ] max / 2 ( SWI-Prolog , GNU-Prolog ). Обратите внимание, что большинство или все реализации Prolog будут иметь встроенную функцию max_list / 2 ( S , G ), поэтому на самом деле нет необходимости определять ее

Редактировать: Бакор отмечает , что хвостовая рекурсивная реализация может быть более эффективной. Вы можете сделать это, определив предикат max_list / 3 , который принимает дополнительный аргумент C , а именно самое большое значение, наблюдаемое до сих пор.

max_list([H|T], M) :- max_list(T, H, M). 

max_list([], C, C).
max_list([H|T], C, M) :- C2 is max(C, H), max_list(T, C2, M).
5
ответ дан 8 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: