Числа Фибоначчи - это любимый способ демонстрации рекурсии (наряду с факториалом, который я использую в Мастеринг Perl ).С вашим примером все в порядке, но вы также должны знать, что во многих случаях вам не нужна эта функция.
Вот итеративное решение, которое строит последовательность из нижнего конца, а не верхнего.Вам не нужно повторяться, потому что вы уже знаете ответы на вычисления, необходимые для следующего шага:
use v5.20;
use experimental qw(signatures);
no warnings qw(experimental::signatures);
sub fibonacci ( $n ) {
my @numbers = qw( 0 1 );
foreach ( 2 .. $n ) {
$numbers[ $_ ] = $numbers[ $_ - 1 ] + $numbers[ $_ - 2 ];
}
return @numbers[ 0 .. $n ];
}
my @series = fibonacci( 1 );
say "Fibo Series : @series";
Это становится еще лучше, потому что вы можете изменить это, используя state
, чтобы запомнить предыдущийвычисления.Вы должны использовать ссылку на массив, так как state
не может инициализировать массив, но это не имеет большого значения:
use v5.22;
use experimental qw(signatures postderef);
no warnings qw(experimental::signatures experimental::postderef);
sub fibonacci ( $n ) {
state $numbers = [ qw( 0 1 ) ];
foreach ( $#$numbers .. $n ) {
$numbers->[ $_ ] = $numbers->[ $_ - 1 ] + $numbers->[ $_ - 2 ];
}
return $numbers->@[ 0 .. $n ];
}
my @series = fibonacci( 17 );
say "Fibo Series : @series";