JavaScript'те жаддык эс тутумун оптималдаштыруу

Бардык түзүлгөн өзгөрмөлөр компьютердин жаддык эс тутумунда сакталат. Кээде ойлонбой эле код жазганда колдонулуучу эсти кескин көбөйтүп кетиши мүмкүн.

Келгиле, мисал аркылуу карап көрөлү. Бизге 1 ден 100000000 га чейинки бүтүн сандардын суммасын табуу тапшырмасы коюлсун. Бизде берилген аралыктан бүтүн сандар менен массивди толтуруучу функция бар дейли:

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

Ошондой эле бизде массив элементтеринин суммасын тапкан функция бар дейли:

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

Бул функцияларды айкалыштырып колдонсо, коюлган тапшырманы оңой эле чечсек болот:

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

Чыгарылышы татаал эмес көрүнөт. Бирок, анда бир проблема бар: ал өтө көп жаддык эсти талап кылат.

Келгиле, эсептеп көрөлү. fillArr функциясы 100000000 сандан турган массив түзөт. JavaScript бир сан үчүн 2 байт бөлсө дейли - анда биздин массивди сактоо үчүн 200000000 байт, болжол менен 200 мегабайт жаддык эс керек болот.

Бирок, чындыгында, JavaScript'те массивди сактоодо аябай көп кошумча чыгымдар болгондуктан, жаддык эс андан да көп талап кылынат.

Проблеманы түшүнүп, тапшырманы чечип, практикалык түрдө жаддык эсти талап кылбаган функцияны жазуу оңой:

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

Тапшырманы биздин функциябыз менен чечебиз:

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

Бир программачыга берилген аралыкта жаткан, 7 ге калдыксыз бөлүнгөн сандардын санын табуу тапшырмасы коюлган. Ал аны төмөнкүдөй чечкен:

javascriptlet arr = [];

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

console.log(arr.length);

Бул коддо эмне туура эмес экенин түшүндүрүңүз. Кодду дагы оптималдуу кылып өзгөртүңүз.

Задание 2

Бир программачыга сандын бөлүүчүлөрүнүн суммасын табуу тапшырмасы коюлган. Ал аны төмөнкүдөй чечкен:

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);

Бул коддо эмне туура эмес экенин түшүндүрүңүз. Кодду дагы оптималдуу кылып өзгөртүңүз.