用于Perl挑战的算法中神秘的“未初始化的数组值”

时间:2011-07-10 21:54:35

标签: perl initialization

目前正在学习Perl,并尝试解决一些挑战,以便从前4,000,000个Fibonacci术语中找到偶数项的总和。我创建了一个似乎有效的Fibonacci数组,然后尝试了不同的方法来抛弃奇值项,并在尝试求和我的结果数组时不断遇到错误,得到以下报告:

Use of uninitialized value in addition (+) at prob2_3.plx line 23

这就是我所拥有的:

#!/usr/bin/perl -w
# prob2_2.plx
use warnings;
use strict;

my @fib; my $i; my $t; my $n;
@fib = (1, 2);



for ($i=2; $i<4000000; $i++)  {
  my $new= ( $fib[$i-1] + $fib[$i-2] );
  push @fib, $new;}


for ($t=3; $t<4000000; $t++)  {
  if (($fib[$t] % 2) != 0 ) {
  delete $fib[$t];  }  }

my $total = 0;

for ($n=1; $n<$#fib; $n++) {
$total += $fib[($n+1)];}  

print  $total;

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:0)

好像第4百万个斐波纳契数超过10 ^ 835950的事实不是一个很大的问题,这不是很好:

for ($t=3; $t<4000000; $t++)  {
  if (($fib[$t] % 2) != 0 ) {
  delete $fib[$t];  }  }

my $total = 0;

for ($n=1; $n<$#fib; $n++) {
$total += $fib[($n+1)];}  

为什么你在这里两次走过名单?更好的是将两个循环合二为一。你想要奇数项的总和,所以求和奇数项。不要delete奇怪的术语(风格非常糟糕),然后再次遍历列表,依赖于undef的数值为0(但只有警告)的事实。

而且,该代码的格式非常非常难看。最终,您将编写其他人需要阅读或维护的代码。我的座右铭:想象一下,维护你的代码的人是一个知道你住在哪里的精神病患者。

答案 2 :(得分:0)

正如池上指出的那样,你的未初始化问题是假设删除数组中的元素,实际上它只是将它们设置为undef(除非它们位于数组的末尾)。

考虑到较大Fibonacci数的存储要求,您根本不希望它们在数组中;幸运的是,没有必要为这个问题保留它们。 我会这样做(需要很长时间才能运行):

use strict;
use warnings;
use Math::BigInt 'lib' => 'GMP';

my $fib_A = Math::BigInt->new(0);
my $fib_B = Math::BigInt->new(1);
my $sum = Math::BigInt->new(0);

# get the next 3999998
for (1..(4000000-2)) {
    my $next = $fib_A + $fib_B;
    $sum += $next if $next % 2 == 0;
    ($fib_A, $fib_B) = ($fib_B, $next);
}

print "The sum is $sum\n";