perl 如何获得数组中最大元素的索引?

cotxawn7  于 2022-11-15  发布在  Perl
关注(0)|答案(6)|浏览(172)

我想找出数组中的最大值并打印出它的索引。
我写了这个为打印最大值;我不知道该怎么办,也不知道该怎么办。

use feature "say";
use List::Util qw(max);
@x=qw(10 -2 -48 -5 7 34 28);
say "valore massimo: ".max @x;
km0tfn4u

km0tfn4u1#

核心List::Util自带全能的reduce,可以直接计算出各种结果

use warnings;
use strict;
use feature 'say';

use List::Util qw(reduce);

my @x = qw(10 -2 -48 -5 7 34 28);

my $max_idx = reduce { $x[$a] > $x[$b] ? $a : $b } 0..$#x;

say "Maximal value of $x[$max_idx] is at index $max_idx";

可以用一个简单的函数来 Package 它,以便为操作提供一个清晰的名称(max_idx之类的,它可以返回元素及其索引,可能只在列表上下文中)。列表实用程序的库通常只是将reduce表达式打包到方便的函数中。
具有上述功能的实用程序是max_by,它来自List::UtilsBy,如Silvio Mayolo's answer所示(但我们不必首先创建索引数组)。
一个吹毛求疵,但我想提一下。问题中给出的(显然)数字列表qw(10 -2 -48 -5 7 34 28)是一个字符串列表(“单词”),因为qw操作符构建了东西。
一旦它们被这样使用,它们就被当作数字来处理,就像解释器通常做的那样,一切都很好。

my @x = (10, -2, -48, -5, 7, 34, 28);

更多的打字,但我发现它更清楚地传达了意图。同样,这对大多数(任何?)代码来说都没有任何后果。

8cdiaqws

8cdiaqws2#

x1E0F1x提供x1M1N1x,用于根据某个其它准则(其可以是另一列表)获得最大值。

use 5.010;
use List::UtilsBy qw/max_by/;

my @x = qw(10 -2 -48 -5 7 34 28);
my @indices = (0..@x-1);
say max_by { $x[$_] } @indices;

一般来说,如果您要在Perl中进行重要的列表操作,我建议安装List::AllUtils,它是一个一体化的包,包括List::UtilList::SomeUtilsList::UtilsBy

0vvn1miw

0vvn1miw3#

对于像这样的小任务,实际上不需要使用外部库。

use strict;
use warnings;
use feature 'say';

my @x = (10, -2, -48, -5, 7, 34, 28);
my $max = 0;     # first index is the max
for (0 .. $#x) {
    if ($x[$_] > $x[$max]) {
        $max = $_;
    }
}
say "@x";
say "Max number is $x[$max] with index $max";

输出量:

10 -2 -48 -5 7 34 28
Max number is 34 with index 5

只需循环索引,检查值并保存编号最大的索引。

11dmarpk

11dmarpk4#

你正在做的任务绝对是编程的基础和关键,如果你开始学习编程,你应该能够自己想出解决方案。
是的,有很好的模块,使这个任务更优雅,但如果你正在学习编程,你至少应该想出一个这样的解决方案,自己!

printf "%d\n", max_index(10,3,22,5,4,11,33); # prints 6
printf "%s\n", max_index(34,21,100,12,9);    # prints 2

sub max_index {
    my ( @list ) = @_;
    
    my $max_index = 0;
    my $max_value = shift @list;
    
    my $idx = 0;
    for my $current ( @list ) {
        $idx++;
        if ( $current > $max_value ) {
            $max_index = $idx;
            $max_value = $current;
        }
    }
    
    return $max_index;
}

家庭作业:
1.如果没有传递任何元素给函数,会发生什么?应该返回什么?
1.使其与数组引用一起工作。
1.使用经典的for循环for (..., ..., ...) { ... },不要使用shift
1.如果传递字符串而不是数字,会发生什么?
1.你知道问题4的解法吗?

dly7yett

dly7yett5#

在这种情况下,如果你想只使用Perl,由于Perl模块安装的限制-要找到数组中最大值的索引,你可以使用以下算法:

  • 假设数组中第一个元素具有$max
  • 将下列数组元素与$max进行比较
  • 如果满足条件,则存储max元素的索引和值
use strict;
use warnings;
use feature 'say';

my @arr = qw(10 -2 -48 -5 7 34 28);
my($ind,$max) = find_max(\@arr);

say "arr[$ind] = $max";

sub find_max {
    my $arr = shift;

    my($i,$max)=(0,$arr->[0]);
    
    for( 1..$#{$arr} ) {
        ($i,$max) = ($_,$arr->[$_]) if $max < $arr->[$_];
    }
    
    return ($i,$max);
}

输出量

arr[5] = 34
ndasle7k

ndasle7k6#

您可以尝试以下代码

use List::Util qw(max);

my @x = qw(10 -2 -48 -5 7 34 28);
my ($index) = ( grep { $x[$_] eq max(@x) } 0..$#x );
print "max ", max(@x), " index $index\n";

输出量

max 34 index 5

相关问题