Uboreshaji wa Arrays Zisizohitajika katika PHP

Acha mprogrammer fulani anakabiliwa na kazi ya kupata jumla ya namba kamili kutoka 1 hadi 100000000.

Mprogrammer wetu aliandika suluhisho zuri la kazi hii, kama ifuatavyo:

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

Suluhisho zuri, sivyo? Katika mstari mmoja na yote hayo. Lakini halifanyi kazi! Jaribu kuendesha code hii na itakosa na kuonyesha hitilafu kwamba umeomba kumbukumbu ya kijani sana.

Hmm, 100000000 inaonekana sio nyingi sana? Au ni nyingi? Wacha tuhesabu. Function range inaunda array yenye 100000000 namba. Acha PHP itoe 2 bytes kwa kila namba - basi kuhifadhi array yetu itahitaji 200000000 byte, yaani takriban 200 megabaiti za kumbukumbu.

Lakini kwa kweli kumbukumbu itahitajika zaidi kutokana na ukweli kwamba PHP ina gharama kubwa za ziada wakati wa kuhifadhi array. Kwa mfano, kwenye maandishi yangu hitilafu inasema, kuwa ninajaribu kutenga 4294967304 byte - takriban 4 gigabaiti!

Inaeleweka sasa, kwa nini hitilafu inatokea - tumetoka nje ya kikomo cha kumbukumbu kilichoruhusiwa.

Sio ngumu kuandika upya script yetu kwa njia nyingine, isiyotumia kumbukumbu nyingi:

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

Au bora zaidi tunatumia suluhisho la kihisabati:

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

Mprogrammer fulani alikabiliwa na kazi ya kupata factorial ya namba fulani. Aliitatua kama ifuatavyo:

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

Eleza, nini kibaya na code hii. Badilisha code kuwa bora zaidi.

Задание 2

Mprogrammer fulani alikabiliwa na kazi ya kupata idadi ya tarakimu, ambazo zinaweza kutumika kuandika namba zote kamili kutoka 1 hadi 1000000. Aliitatua kama ifuatavyo:

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

Eleza, nini kibaya na code hii. Badilisha code kuwa bora zaidi.

Задание 3

Mprogrammer fulani alikabiliwa na kazi ya kupata idadi ya namba, zinazogawanyika bila baki kwa 7, zilizo kwenye muda maalum. Aliitatua kama ifuatavyo:

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

Eleza, nini kibaya na code hii. Badilisha code kuwa bora zaidi.

Задание 4

Mprogrammer fulani alikabiliwa na kazi ya kupata jumla ya vigawanyiko vya namba. Aliitatua kama ifuatavyo:

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

Eleza, nini kibaya na code hii. Badilisha code kuwa bora zaidi.