2010-09-22 2 views
4

Я пытаюсь вернуть максимальный список., возвращающий максимальный список

У меня есть следующий код

list_max([]) -> 
    []; 
list_max([H|T]) -> 
    list_max(H, T). 
list_max(Temp, []) -> 
    Temp; 
list_max(Temp, [H|T]) when H > Temp -> 
    Temp = H; 
list_max(Temp, T). 

Но я изо всех сил относиться к Erlang.

Как назначить что-то временному и заменить его на самое высокое?

ответ

3

Erlang - один из тех языков, на котором мне легче показать, чем объяснять.

list_max([] ) -> empty; 
list_max([H|T]) -> {ok, list_max(H, T)}. 

list_max(X, [] )   -> X; 
list_max(X, [H|T]) when X < H -> list_max(H, T); 
list_max(X, [_|T])   -> list_max(X, T). 

и называть его таким образом:

{ok, Max} = list_max(MyList). 
+0

@ daniel-luna пример лучший. На самом деле это реализация Erlang на основе списков: max (L). Почему это лучше? Пожалуйста, обратите внимание на порядок итераций.В вашем случае вы будете лишним соответствовать FIRST для каждой итерации конца списка. Примеры лучших итераций приведены в примере daniel-luna –

1

Вы также можете выразить, чем встроенные функции:

-module(list_max). 
-compile(export_all). 

list_max([]) -> none; 
list_max([H | T] = List) -> 
    lists:foldl(fun erlang:max/2, H, T); 
list_max(_) -> badarg. 
+0

Поскольку 'max' является ассоциативным, вместо этого вы должны использовать tail-recursive' foldl'. –

+0

Для меня это очень важно, но я благодарю вас. Просто начал делать erlang этот термин в Uni. – jarryd

+0

@Marcel Cantos Вы правы. Я исправлю это. – stmi

3

Как назначить то темп и заменить его на наибольший?

Короткий ответ заключается в том, что вы не можете. Переменные в Erlang не могут быть изменены после назначения.

Немного более длинный ответ заключается в том, что, хотя вы не можете изменить переменную внутри определенного вызова функции, вы всегда можете самостоятельно выполнять рекурсию. Оптимизирована рекурсия хвоста в Erlang.

В примере кода, который вы указали, list_max будет когда-либо смотреть только на первые два элемента списка. В четвертом и пятом предложениях каждый должен снова вызвать list_max, с новым значением Temp в первом параметре. Это обычное дело в функциональных языках. В этом случае Temp известен как Accumulator (я часто называю переменную Acc, чтобы отразить это использование, но, конечно, вы можете назвать ее, как хотите).

Позвольте мне показать другое решение, которое можно было бы рассматривать как «промежуточный» ответ Macelo и ответ stmi в:

list_max([H|T]) -> list_max(H , T). 

list_max(X , [] ) -> X; 
list_max(X , [H|T]) -> list_max(erlang:max(H, X) , T). 

(я угробил пункт, который определяет пустой список, потому что я не думаю, что это действительно вы покупаете много - хотя теперь он будет генерировать исключение, если вы вызываете его с пустым списком.)

1

Erlang - это одно задание, поэтому вы не можете изменить «переменные». Вы можете создавать только новые.

Моя рекомендация - посмотреть модуль списков. Внутри lists.erl вы найдете:

max([H|T]) -> max(T, H). 

max([H|T], Max) when H > Max -> max(T, H); 
max([_|T], Max)    -> max(T, Max); 
max([], Max)    -> Max. 

Вы не обновляют переменную Max (Temp в вашем примере), а вызов функции с новым значением или вернуть его из функции.

... Проще простого :-)

+0

Это правильный пример. На самом деле это реализация Erlang на основе списков: max (L). Почему это лучше? Обратите внимание, что итерационный заказ предлагает лучшую производительность по сравнению со всеми другими решениями, размещенными здесь. –

2

К сожалению, может быть, я что-то не хватает. Вы искали:

lists:max(List). %% Find the max in List 
+0

Нет, мне нужно сделать это сам. : P – jarryd

+0

Хорошо! : D Спасибо. Теперь я могу понять документацию hahaha –

Смежные вопросы