目前正在学习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;
答案 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";