Улучшенная версия &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 последовательно перебирает все остальные значения в списке параметров @_. Следующее значение $_ равно 4. Условие не выполняется, так как параметр меньше текущего значения $max_so_far (10); тело блока if пропускается. При следующей итерации переменная $_ равна 6, тело if снова пропускается. Поскольку это была последняя итерация, цикл завершен. В итоге функция возвращает значение $max_so_far. Это наибольшее значение среди просмотренных элементов, а раз мы просмотрели их все, это самое большое число в списке: 10. Статьи из раздела Perl на эту тему: ![]() ![]() ![]() ![]() ![]() Вернуться в раздел: Perl / 3. Пользовательские функции
|