2013-04-05 70 views
0

我正在研究采用一个或多个数组的平均值的子程序。我想这样做,而不使用模块。子程序,需要一个或多个数组的平均值

use strict; 
use warnings; 

use List::Util 'sum'; 

my @w = (0, 2); 
my @x = (1, 3); 
my @y = (2, 2); 
my @z = (1, 1); 

# the average of these four arrays is (1,2) since 
# (0+1+2+1)/4 = 1 and (2+3+2+1)/4 = 2  

my @arrays = \(@w, @x, @y, @z); 

my @avg; 
# this is the way to do it using the module 
for my $i (0..$#w) { 
    $avg[$i] = sum(map $_->[$i], @arrays)/@arrays; 
} 
print "@avg\n"; 

# my way of doing it without module 
@avg; 
for my $i (0..$#w) { 
    $avg[$i] = prod_sum(map $_->[$i], \@arrays)/@arrays; 
} 

print "@avg\n"; 


# subroutines 
sub prod_sum{ 
    my $o = $_[0]; 
    my $arr_ref = $_[1]; 
    my $array_ref; 

    foreach my $row (@$arr_ref){ 
     foreach my $cell (@$row) { 
      push(@{ $array_ref }, $_); 
     } 
    } 

    my $sum = $o + the_sum($array_ref); 
    return $sum; 
} 

sub the_sum{ 
    my $sum = 0; 
    for (@{$_[0]}) { 
     $sum += $_; 
    } 
    return $sum; 
} 

输出

1 2 
[pair of really random big numbers] 

第一输出是正确的。它显示所有数组的平均值。第二个输出是完全错误的。我如何在不使用模块的情况下做到这一点?

+0

'我@avg =算法::循环:: MapCarE {总和(@_)/ @ _} \(@ W, @x,@y,@z);' – ysth 2013-04-05 20:49:24

+0

你能用英文解释prod_sum正在尝试做什么吗?我无法完成。在任何情况下,它期望两个参数,你传递一个映射的单一结果 – ysth 2013-04-05 20:52:30

+0

我试图在'List :: Util'模块中复制'sum'函数。 – cooldood3490 2013-04-05 20:53:38

回答

1

我提出这个解决方案:

use strict; 
use warnings; 

my @w = (0, 2); 
my @x = (1, 3); 
my @y = (2, 2); 
my @z = (1, 1); 

my @arrays = \(@w, @x, @y, @z); 

my ($x, $y) = (0, 0); 
foreach my $arr(@arrays) { 
    $x += $arr->[0]; 
    $y += $arr->[1]; 
} 

my @result = ($x/@arrays, $y/@arrays); 

print "(@result)", "\n"; # <---- prints (1 2) 
+0

如果每个数组都有100个元素,上面的代码会如何改变?我将如何取平均值,使得最终数组'@ result'的长度为100.您需要一个计数器吗? – cooldood3490 2013-04-05 22:18:43

+0

如果每个阵列中有两个以上的元素,则不会使用此解决方案。 – Borodin 2013-04-06 01:42:23

1

您认为sum是通过两个变量,它不是。它只被传递给一个数组。修改你的prod_sum只期望一个数组(并且在prod_sum的调用中替换\@arrays仅为@arrays)。或者你可以使用这个:

sub sum { 
    return 0 if $#_ < 0; 
    my $head = shift; 
    return $head + sum(@_); 
} 

上面是一个递归子例程,将一个数组求和。

注意:如果你的数组有多于100个元素,use warnings会发出深度递归警告。欲了解更多关于该主题,请参阅here

+0

无论发生什么事情,如果可能避免递归?当然,所有你需要的是'sub sum {my $ sum = 0; $ sum + = $ _ for @_; $ sum}' – Zaid 2013-04-05 21:14:08

+0

@Zaid你是对的,perl没有优化尾递归。 – imran 2013-04-05 21:23:52

相关问题