[Cascavel-pm] Somar elementos numericos de um array

Igor Sutton Lopes igor.sutton em gmail.com
Terça Abril 10 01:37:14 PDT 2007


Oi,

On Apr 10, 2007, at 8:12 AM, Luis Motta Campos wrote:

> On Apr 9, 2007, at 4:57 PM, Patty Silva wrote:
>> Pessoal.. tem como eu somar elementos numericos de um array?
>> ex:
>> @teste=(1,2,4,1,3,1,1,1,4,56,7,8,9);
>> somar=1+2+4+1+3....
>> sem precisar do for?
>
>    Patty
>
>    O pessoal sugeriu que você usasse outros métodos, que eu considero
> equivalentes ao FOR: MAP, List::Util e outros. Aqui tem uma sugestão
> genérica, que é complicada de ler, não serve para código de produção
> mas é educativa.
>
>    Conceito: você está precisando somar uma lista de números.
>    Solução sugerida: construa um programa que faça isso e rode o
> programa, colete o resultado no final.
>    Implementação:
>
>    #!/usr/bin/perl
>    use strict;
>    use warnings;
>    use English; # Para poder dizer $LIST_SEPARATOR ao invés de $"
>    my @numeros = 1..100;
>    my $soma;
>    local $LIST_SEPARATOR = '+'; # se você não usar "English", use
> ($"), que é a mesma coisa.
>    my $programa = qq{\$soma = @numeros};
>    eval $programa;
>    if( $@ ) { # erro no programa?
>      print STDERR "$@";
>    } else {
>      print $soma, $/;
>    }
>    __END__
>
>    Como você pode ver, meu programa não usa loops (bom, o CORE do
> Perl usa, mas isto é o mais perto que se pode chegar da ausência de
> loops...)
>
>    Alguém pode por favor incluir a minha sugestão nos benchmarks?
>    Putamplexos!

Que coisa horrorosa Champs :-D Mas a diferença disso tudo foi a  
presença de "educacional" algures ali acima. Esta foi a solução que  
conversei com o Éden ontem :-) Acho que vocês tem um estilo bem  
parecido de programar.

O teste:

<code>
use strict;
use warnings;

use List::Util qw(sum);
use Benchmark qw(:all);

my @numbers = ( 1 .. 10 );

cmpthese(
     -3,
     {
         'map' => sub {
             my $result;
             map { $result += $_ } @numbers;
         },
         'for' => sub {
             my $result;
             $result += $_ for @numbers;
         },
         'sum' => sub {
             my $result = sum(@numbers);
         },
         'eval' => sub {
             local $" = '+';
             my $result;
             eval qq{\$result = @numbers};
           }
     }
);
</code>

O resultado:

           Rate  eval   for   map   sum
eval   28528/s    --  -93%  -94%  -99%
for   399865/s 1302%    --  -14%  -85%
map   464529/s 1528%   16%    --  -83%
sum  2738845/s 9500%  585%  490%    --


--
Igor Sutton
igor.sutton em gmail.com



-------------- Próxima Parte ----------
Um anexo não texto foi limpo...
Nome  : PGP.sig
Tipo  : application/pgp-signature
Tam   : 186 bytes
Descr.: This is a digitally signed message part
Url   : http://mail.pm.org/pipermail/cascavel-pm/attachments/20070410/ae773645/attachment.bin 


Mais detalhes sobre a lista de discussão Cascavel-pm