具有数组引用的Perl Fibonacci数字程序?

时间:2012-06-30 20:03:36

标签: perl

编辑:已解决。见下面的解决方案。

我为前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";
}

编辑:已解决。见下面的解决方案。

2 个答案:

答案 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)

我发现了自己的错误。我每次都会从阵列中弹出两次,所以我需要记住在推送$ sum之前将这些数字重新打开。不管怎样,谢谢。