编辑:已解决。见下面的解决方案。
我为前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";
}
编辑:已解决。见下面的解决方案。
答案 0 :(得分:6)
关于你的计划的一些注释:
除非您绝对确定您正在做什么,否则避免使用子程序原型非常重要。原型主要用于为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);
}
<强>输出强>
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
答案 1 :(得分:2)