Самый простой способ - немного рекурсии - просто измените это:
my $ref1 = $_[0];
my $ref2 = $_[1];
на это:
my $ref1 = shift;
my $ref2 = shift;
и это:
return @product;
наэто:
if(@_ > 0)
{ return &matrix(\@product, @_); }
else
{ return @product; }
Но самый эффективный способ - это начать с изучения размеров различных массивов и, таким образом, определить наилучший порядок выполнения умножений.(Умножение массивов, хотя и не коммутативное, является ассоциативным, и если не все массивы имеют одинаковые измерения, то A(BC)
может быть намного дороже или намного дешевле, чем (AB)C
. Например, если размеры 1-by-100, 100 на 1 и 1 на 100, затем (AB)C
создает матрицу 1 на 1 в качестве промежуточного шага, тогда как A(BC)
создает матрицу 100 на 100 в качестве промежуточнойшаг.)