Здесь кто-то должен добавить решение для функционального программирования, поскольку математическая формула такого рода просто требует рекурсии.;)
sub isIncreasingArray {
return 1 if @_ <= 1;
return (pop(@_) - $_[-1] == 1) && isIncreasingArray(@_);
}
Что касается аргумента подпрограммы, представляющего собой массив против нескольких аргументов, подумайте об этом следующим образом: Perl всегда отправляет список аргументов вашей подпрограмме в виде массива @_.Вы можете либо сдвигать, либо извлекать аргументы из этого массива как отдельные скаляры, или иным образом оперировать всем списком как массивом.Внутри вашей подпрограммы это все еще массив, точка.
Если вы попадете в ссылки, да, вы можете передать ссылку на массив в подпрограмму.Эта ссылка все еще технически передается вашей подпрограмме в виде массива (списка), содержащего одно скалярное значение: ссылку.Сначала я проигнорировал бы все это и обернул бы вас вокруг основной операции без ссылок.
Вызов подпрограммы.Таким образом, Perl тайно преобразует ваш пустой список скаляров в массив скаляров:
isIncreasingArray(1,2,3,4);
Таким образом, Perl передает ваш массив:
@a = (1,2,3,4);
$answer = isIncreasingArray(@a);
В любом случае, подпрограммаполучает массив.И это копия *, отсюда и разговор об эффективности.Не беспокойтесь об этом для K <10000, даже с моим смехотворно неэффективным, академическим, элегантным, рекурсивным решением, которое все еще занимает менее 1 секунды на моем ноутбуке: </p>
print isIncreasingArray(1..10000), "\n"; # true
* Копия: своего родано не совсем?См. Комментарии ниже и другие ресурсы, например PerlMonks .«Можно утверждать, что Perl всегда делает Pass-By-Reference, но защищает нас от нас самих».Иногда.На практике я делаю свои собственные копии внутри подпрограмм в локализованные «мои» переменные.Просто сделай это.