我正在Web应用程序中进行一系列数学运算,我想获得如下内容:
给出一个由N个元素组成的数组,例如[1,2,3]
,在屏幕上打印另一个具有相同元素数量的数组,其中每个位置都是该数组除要计算位置之外的所有元素的乘积。 / p>
结果示例:
[1,2,3]
必须打印:[6,3,2]
[5,2,3,2,4]
必须打印:[48,120,80, 120, 60]
答案 0 :(得分:4)
您可以使用androidx.appcompat:appcompat
获取数组中所有值的乘积,然后使用LifecycleOwner
除以给定的每个值以从整体乘积中“删除”该值。
ComponentActivity
输出:
FragmentActivity
其他情况:
AppCompatActivity
给出lifecycle
答案 1 :(得分:2)
没有特殊的数组操作(切片/拼接),只是超级简单的数学。
代码:(Demo)
$array = [5,2,3,2,4];
foreach ($array as $val) {
$result[] = array_product($array) / $val;
}
var_export($result);
输出:
array (
0 => 48,
1 => 120,
2 => 80,
3 => 120,
4 => 60,
)
您可以在循环之前缓存array_product($array)
,以提高效率。 Demo这实际上与Nick的回答是相同的逻辑,我只是发现使用语言构造而非函数式编程更容易阅读。
答案 2 :(得分:1)
正常的for循环使您可以访问当前索引。在循环的每次迭代中,您可以使用array_slice进行复制,并使用array_splice删除一个元素。然后使用适当的回调array_reduce乘以剩余的值。
function reduce_to_products_without_value_at_index( $initial_array ) {
$num_elements = count( $initial_array );
$product_array = [];
for ( $index = 0; $index < $num_elements; $index++ ) {
$array_copy = array_slice( $initial_array, 0 );
array_splice( $array_copy, $index, 1 );
$product = array_reduce( $array_copy, function( $carry, $item ) {
return $carry * $item;
}, 1 );
$product_array[$index] = $product;
}
print_r( $product_array );
}
reduce_to_products_without_value_at_index( [1,2,3] );
reduce_to_products_without_value_at_index( [5,2,3,2,4] );