Optimización de arrays innecesarios en PHP

Supongamos que un programador tiene la tarea de encontrar la suma de números enteros desde 1 hasta 100000000.

Nuestro programador escribió una solución elegante para este problema, así:

php<?php
  echo array_sum(range(1, 100000000));
?>

Una solución bonita, ¿no? En una línea y todo eso. Pero no funciona. ¡Intenta ejecutar este código y mostrará un error acerca de que solicitaste demasiada memoria RAM.

Bueno, ¿100000000 no parece tanto? ¿O sí? Vamos a contar. La función range crea un array con 100000000 números. Supongamos que PHP asigna 2 bytes por número - entonces para almacenar nuestro array necesitaríamos 200000000 bytes, es decir, algo alrededor de 200 megabytes de memoria RAM.

Pero en realidad se necesitará mucha más memoria RAM debido a que PHP tiene gastos generales muy grandes al almacenar un array. Por ejemplo, en mi caso el error indica que estoy intentando asignar 4294967304 bytes - ¡algo como 4 gigabytes!

Queda claro ahora por qué sale el error - hemos excedido con creces el límite de memoria permitido.

No es tan difícil reescribir nuestro script de otra manera, prácticamente sin consumir memoria RAM:

php<?php
  $sum = 0;
  
  for ($i = 1; $i <= 100000000; $i++) {
    $sum += $i;
  }
  
  echo $sum;
?>

O mejor aún, usamos la solución matemática:

php<?php
  $n = 1000000;
  $sum = $n * ($n + 1) / 2;
  echo $sum;
?>
Задание 1

Un programador tenía la tarea de encontrar el factorial de un número dado. Lo resolvió de la siguiente manera:

php<?php
  $n = 100;
  echo array_product(range(1, $n));
?>

Explica qué está mal con este código. Reescribe el código de manera más óptima.

Задание 2

Un programador tenía la tarea de encontrar la cantidad de dígitos necesarios para escribir todos los números enteros desde 1 hasta 1000000. Lo resolvió de la siguiente manera:

php<?php
  echo strlen(implode('', range(1, 1000000)));
?>

Explica qué está mal con este código. Reescribe el código de manera más óptima.

Задание 3

Un programador tenía la tarea de encontrar la cantidad de números divisibles exactamente por 7, dentro de un intervalo dado. Lo resolvió de la siguiente manera:

php<?php
  $arr = [];
  
  for ($i = 0; $i <= 1000; $i++) {
    if ($i % 7 == 0) {
      $arr[] = $i;
    }
  }
  
  echo count($arr);
?>

Explica qué está mal con este código. Reescribe el código de manera más óptima.

Задание 4

Un programador tenía la tarea de encontrar la suma de los divisores de un número. Lo resolvió de la siguiente manera:

php<?php
  $num = 320;
  $divs = [];
  
  for ($i = 0; $i <= $num; $i++) {
    if ($num % $i == 0) {
      $divs[] = $i;
    }
  }
  
  echo array_sum($divs);
?>

Explica qué está mal con este código. Reescribe el código de manera más óptima.