[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