JavaScriptda xotira sarfini optimallashtirish

Yaratilgan barcha o‘zgaruvchilar kompyuterning operativ xotirasida saqlanadi. Ba’zan beparvo kod yozish xotira sarfini keskin oshirishi mumkin.

Keling, buni misol orqali ko‘rib chiqaylik. Faraz qilaylik, bizning vazifamiz 1 dan 100000000 gacha bo‘lgan butun sonlar yig‘indisini topish. Faraz qilaylik, bizda berilgan oraliqdagi butun sonlar bilan massivni to‘ldiruvchi funksiya bor:

javascriptfunction fillArr(a, b) {
  let res = [];
  
  for (let i = a; i <= b; i++) {
    res.push(i);
  }
  
  return res;
}

Faraz qilaylik, shuningdek, massiv elementlari yig‘indisini topadigan funksiya ham bor:

javascriptfunction getSum(arr) {
  let sum = 0;
  
  for (let elem of arr) {
    sum += elem
  }
  
  return sum;
}

Ushbu funksiyalarning kombinatsiyasi yordamida berilgan vazifani osongina hal qilish mumkin:

javascriptlet sum = getSum(fillArr(1, 100000000));

Yechim nafis bo‘ldi. Biroq, unda muammo bor: u juda ko‘p operativ xotira sarflaydi.

Keling, hisoblaylik. fillArr funksiyasi 100000000 ta son bilan massiv yaratadi. Faraz qilaylik, JavaScript son uchun 2 bayt ajratadi - unda bizning massivimizni saqlash uchun 200000000 bayt, ya’ni taxminan 200 megabayt operativ xotira kerak bo‘ladi.

Lekin aslida operativ xotira ko‘proq talab qilinadi, chunki JavaScript-da massivni saqlashda juda katta qo‘shimcha xarajatlar bor.

Muammoni tushunib, vazifani hal qiladigan va amalda operativ xotira sarflamaydigan funksiyani yasash oson:

javascriptfunction getNumsSum(max) {
  let sum = 0;
  
  for (let i = 1; i <= max; i++) {
    sum += i;
  }
  
  return sum;
}

Keling, vazifani ushbu funksiya yordamida hal qilaylik:

javascriptlet sum = getNumsSum(100000000);
Задание 1

Bir dasturchi oldiga 7 ga qoldiqsiz bo‘linadigan, berilgan oraliqda joylashgan sonlar miqdorini topish vazifasi qo‘yilgan edi. U uni quyidagicha hal qildi:

javascriptlet arr = [];

for (let i = 0; i <= 1000; i++) {
  if (i % 7 == 0) {
    arr.push(i);
  }
}

console.log(arr.length);

Ushbu kodda nima noto‘g‘ri ekanligini tushuntiring. Kodni yanada optimalroq qilib qayta yozing.

Задание 2

Bir dasturchi oldiga sonning bo‘luvchilari yig‘indisini topish vazifasi qo‘yilgan edi. U uni quyidagicha hal qildi:

javascriptfunction getDivisors(num) {
  let res = [];
  
  for (let i = 1; i <= num; i++) {
    if (num % i === 0) {
      res.push(i);
    }
  }
  
  return res;
}

function getSum(arr) {
  let sum = 0;
  
  for (let elem of arr) {
    sum += elem
  }
  
  return sum;
}

let sum = getSum(getDivisors(320));
console.log(sum);

Ushbu kodda nima noto‘g‘ri ekanligini tushuntiring. Kodni yanada optimalroq qilib qayta yozing.