ドキュメントでは、の動作についてreduce
次のように説明しています。
最初の呼び出しは$aと$bがリストの最初の2つの要素に設定され、後続の呼び出しは$ aを前の呼び出しの結果に設定し、$bをリストの次の要素に設定することによって行われます。
したがって、この場合、最初の反復でreduce
設定され$a = 0
、$b = 1
したがって、実行されます
$arr1[0] * $arr2[0] + $arr1[1] * $arr2[1]
この一時的な結果はたまたま20です。
ここで、2回目の反復で$a
は、前の反復の結果などに設定され$a = 20
ます$b = 2
。したがって、以下が実行されます
$arr1[20] * $arr2[20] + $arr1[2] * $arr2[2]
これは私たちが望んでいることではありません。
考えられる回避策:
0
次のように、入力として提供されたリストの先頭にイニシャルを追加reduce
します。
my $dot_prod = reduce { $a + $arr1[$b] * $arr2[$b] } 0, 0..$#arr1;
これにより、最初の反復で望ましい結果が得られ、$a = $b = 0
計算します。
0 + $arr[0] * $arr[0]
その結果は6になります。
次に、2回目の反復で、次の$a = 6
$b = 1
ように計算します。
6 + $arr1[1] * $arr2[1]
等