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

Nos*_*tap 1 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";
}
Run Code Online (Sandbox Code Playgroud)

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

Bor*_*din 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);
}
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)