编辑:已解决.见下面的解决方案
我为前10个数字编写了以下斐波那契数字程序; 但是我无法让它发挥作用.它一直告诉我,Use of uninitialized value $secondLast in addition (+) at fib.plx line 22.它永远运行.我是初学者Perl程序员,所以我确定错误非常简单.谢谢.
#!/usr/bin/perl
use warnings;
use strict;
sub fib(\@$);
my @defaultNums = (1,1);
my $max = 10;
fib(@defaultNums,10);
sub fib(\@$)
{
my $nums_ref = $_[0];
my $max = $_[1];
foreach(@{$nums_ref})
{
print "$_, ";
}
print "\n";
my $last = pop (@{$nums_ref});
my $secondLast = pop (@{$nums_ref});
my $sum = $last + $secondLast;
push (@{$nums_ref}, $sum);
if( scalar @{$nums_ref} >= $max) { return; }
fib (@{$nums_ref},$max);
print "\n";
}
Run Code Online (Sandbox Code Playgroud)
编辑:已解决.见下面的解决方案
关于你的计划的一些注意事项:
除非您完全确定自己在做什么,否则避免使用子程序原型非常重要.原型主要用于为Perl内置运算符编写替换,这是很少需要的.您应该明确地通过将调用写为数组来传递对数组的引用fib(\@defaultNums, 10).
Fibonacci序列中的前两个值为零和一.你已经用第二个和第三个值播种了你的序列,虽然它可以正常工作,但在数学上并不正确.
因为Perl对上下文很敏感,所以可以删除scalar调用以比较数组中的元素数.您还可以使用if语句修饰符来避免大量噪音,因此您的return行变为return if @{$nums_ref} >= $max.
您选择的解决方案 - 替换从阵列中弹出的项目 - 效率低且反直觉.使用列表赋值和Perl能够从数组末尾索引数组元素,可以编写my ($last, $secondLast) = @{$nums_ref}[-1, -2]不删除元素的内容,因此不需要替换它们.
这里快速重写您的程序,向您展示您一直缺少的东西!
use strict;
use warnings;
my @defaultNums = (0, 1);
fib(\@defaultNums, 10);
sub fib {
my ($nums_ref, $max) = @_;
print join(', ', @$nums_ref), "\n";
my ($last, $secondLast) = @{$nums_ref}[-1, -2];
my $sum = $last + $secondLast;
push @$nums_ref, $sum;
return if @{$nums_ref} >= $max;
fib($nums_ref, $max);
}
Run Code Online (Sandbox Code Playgroud)
产量
0, 1
0, 1, 1
0, 1, 1, 2
0, 1, 1, 2, 3
0, 1, 1, 2, 3, 5
0, 1, 1, 2, 3, 5, 8
0, 1, 1, 2, 3, 5, 8, 13
0, 1, 1, 2, 3, 5, 8, 13, 21
Run Code Online (Sandbox Code Playgroud)