2012-05-22 13 views
10

Mam tablicę z wartościami 33, 32, 8, 100.Jak znaleźć maksymalną i minimalną wartość w tablicy liczb całkowitych w Perlu?

Jak mogę znaleźć maksymalną i minimalną wartość w tej tablicy?

Czy muszę dołączyć jakieś specjalne biblioteki?

+4

Czy to zadanie domowe? Co próbujesz? –

+2

Co powiesz na nieco google? – jm666

+1

To proste, że masz proste pytania na ten temat, ponieważ otrzymane odpowiedzi są znacznie lepsze niż te, które można znaleźć w Google. –

Odpowiedz

25

List::Util 's min i max są w porządku,

use List::Util qw(min max); 
my $min = min @numbers; 
my $max = max @numbers; 

Ale List::MoreUtils' s minmax jest bardziej efektywne, gdy trzeba zarówno min i max (bo ma mniej porównań).

use List::MoreUtils qw(minmax); 
my ($min, $max) = minmax @numbers; 

Lista :: Util jest częścią core, ale List :: MoreUtils nie jest.

19

Można użyć List::Util to zrobić z łatwością, np.

use List::Util qw(min max); 
my @arr = (33, 32, 8, 100); 
print min(@arr)," ", max(@arr), "\n"; 
+2

+1, ponieważ ta odpowiedź jest obsługiwana przez samoistniejący kod. :) – verisimilitude

0

Użyj List::Util module, który zaleca się zapoznanie się z tak, jak List::MoreUtils:

D:\ :: perl -MList::Util=max -lwe "print max 324, 43, 53, 3532, 43" 
3532 

D:\ :: perl -MList::Util=min -lwe "print min 324, 43, 53, 3532, 43" 
43 
0

List::Util ma „Max” i funkcji „Min”, które można wykorzystać do bezpośredniego znaleźć maksymalna i minimalna lista numerów. Sprawdź, czy możesz tego użyć. Możesz także posortować tablicę, a następnie określić najwyższy i najniższy numer:

1

Powinieneś użyć List::Util, który został wydany z dystrybucją Perla od wersji 5.7.3, więc prawdopodobnie nie wymaga instalacji.

use strict; 
use warnings; 

use feature 'say'; 

use List::Util qw/ max min /; 

my @data = (33, 32, 8, 100); 

say min @data; 
say max @data; 

wyjście

8 
100 
10

Dostarczone rozwiązania są dobre, ale jeśli chcesz je realizować się to całkiem proste:

use strict; 
use warnings; 

my @array = (33, 32, 8, 100); 
my ($min, $max); 

for (@array) { 
    $min = $_ if !$min || $_ < $min; 
    $max = $_ if !$max || $_ > $max 
}; 

print "min: $min\n"; 
print "max: $max\n"; 
17

Bez modułów:

#!/usr/bin/perl 
use strict; 
use warnings; 
my @array = sort { $a <=> $b } qw(33 32 8 100); 
print "min: $array[0]\n"; 
print "max: $array[-1]\n"; 
+2

Spędza trochę czasu na porządkowaniu wartości, które znajdują się pomiędzy min & max, które mogło już wystąpić, biorąc czas O (N log N), kiedy to powinno zająć tylko O ​​(N). – hepcat72

1

Oczywiście, jeśli chcesz jednocześnie mieć maksymalną i minimalną wartość listy, bardziej wydajne jest pobieranie obydwu naraz; musi tylko wykonać 3 porównania zamówień na 2 elementy danych, zamiast 4. Może to mieć znaczenie, jeśli zbiory danych są wystarczająco duże.

List::Util nie zapewnia funkcji minmax, ale robi to List::MoreUtils.

use strict; 
use warnings; 
use feature qw(say); 

use List::MoreUtils qw(minmax); 

my ($min, $max) = minmax @data; 

say $min; 
say $max; 
+0

Właściwie to właśnie widziałem ikegami dało powyżej odpowiedź "List :: MoreUtils". Przepraszam za dupę. – LeoNerd

1

Dla liczb:

my ($min,$max) = (sort {$a <=> $b} @array)[0,-1]; 

Dla strun:

my ($min,$max) = (sort {$a cmp $b} @array)[0,-1]; 
2

Można użyć mapy, aby to zrobić bez potrzeby biblioteki:

my @array = (33, 32, 8, 100); 
my ($max,$min)=(-1e99,1e99); # Initialize to values outside anything in your list 
map {$max=$_ if ($_>$max); $min=$_ if($_<$min);} @array; 
print "max=$max, min=$min\n"; 
Powiązane problemy