Улучшенная версия &max

Давайте перепишем функцию &max так, чтобы она могла вызываться с произвольным количеством аргументов:

$maximum = &max(3, 5, 10, 4, 6);
sub max {
my($max_so_far) = shift @_; # Пока сохраняем как максимальный
# первый элемент
foreach (@_) { # Просмотреть все остальные аргументы
if ($_ > $max_so_far) { # Текущий аргумент больше сохраненного?
$max_so_far = $_;
}
}
$max_so_far;
}

В этом коде используется так называемый «алгоритм водяного горизонта»; после наводнения, когда волны накатят и отступят в последний раз, отметка наибольшего подъема воды покажет, до какого уровня дошло затопление. В этой функции переменная @max_fo_far хранит нашу «отметку наибольшего подъема воды» – максимальное число, обнаруженное при просмотре массива. В первой строке $max_so_far присваивается значение 3 (первый параметр в примере); присваивание осуществляется вызовом shift для массива параметров @_. Теперь @_ состоит из элементов (5, 10, 4, 6), так как элемент 3 был «сдвинут» из массива. А наибольшим числом, обнаруженным на данный момент, остается единственное просмотренное число 3 (первый параметр).

Далее цикл foreach последовательно перебирает все остальные значения в списке параметров @_.


По умолчанию в цикле используется управляющая переменная $_ (не забудьте, что между @_ и $_ нет никакой автоматической связи; просто этим переменным случайно были присвоены похожие имена). При первой итерации переменная $_ равна 5. Условие if видит, что это значение больше @max_so_far, поэтому @max_so_far присваивается 5 – новая «отметка наибольшего подъема». При следующей итерации переменная $_ равна 10. Обнаружен новый максимум, который также сохраняется в $max_so_far.

Следующее значение $_ равно 4. Условие не выполняется, так как параметр меньше текущего значения $max_so_far (10); тело блока if пропускается. При следующей итерации переменная $_ равна 6, тело if снова пропускается. Поскольку это была последняя итерация, цикл завершен. В итоге функция возвращает значение $max_so_far. Это наибольшее значение среди просмотренных элементов, а раз мы просмотрели их все, это самое большое число в списке: 10.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Аргументы
Возвращаемые значения
Вызов пользовательской функции
Вызов функции без &
Директива use strict

Вернуться в раздел: Perl / 3. Пользовательские функции