Как работают эти 2 примера кода?

117
13 марта 2021, 07:50

Как, почему этот код возвращает именно сумму элементов подмассива, а не сумму всех элементов или нуль?Я так понимаю, что в partialSum добавляются все элементы массива

    function getMaxSubSum(arr) {

let maxSum = 0;
  let partialSum = 0;
  for (let item of arr) { // for each item of arr
    partialSum += item; // add it to partialSum
    maxSum = Math.max(maxSum, partialSum); // remember the maximum
    if (partialSum < 0) partialSum = 0; // zero if negative
  }
  return maxSum;
}
alert( getMaxSubSum([-1, 2, 3, -9]) ); // 5
alert( getMaxSubSum([-1, 2, 3, -9, 11]) ); // 11
alert( getMaxSubSum([-2, -1, 1, 2]) ); // 3
alert( getMaxSubSum([100, -9, 2, -3, 5]) ); // 100
alert( getMaxSubSum([1, 2, 3]) ); // 6
alert( getMaxSubSum([-1, -2, -3]) ); // 0

А этот пример это вообще бред... Зачем этот цикл с j внутри i?Что-бы не присвоить sumFixedStart значение 0 при новой итерации? Почему тогда нельзя было просто за пределами цикла присвоить этой переменной 0?

function getMaxSubSum(arr) {
  let maxSum = 0; // if we take no elements, zero will be returned
  for (let i = 0; i < arr.length; i++) {
    let sumFixedStart = 0;
    for (let j = i; j < arr.length; j++) {
      sumFixedStart += arr[j];
      maxSum = Math.max(maxSum, sumFixedStart);
    }
  }
  return maxSum;
}
alert( getMaxSubSum([-1, 2, 3, -9]) ); // 5
alert( getMaxSubSum([-1, 2, 3, -9, 11]) ); // 11
alert( getMaxSubSum([-2, -1, 1, 2]) ); // 3
alert( getMaxSubSum([1, 2, 3]) ); // 6
alert( getMaxSubSum([100, -9, 2, -3, 5]) ); // 100
Answer 1

Чтобы чётко понимать что происходит, лучше всего воспользоваться дебаггером.

Если пока не умеете, можете просто залогировать процесс вычислений:

const pre = document.querySelector('pre'); 
function getMaxSubSum(arr) { 
  let maxSum = 0; // if we take no elements, zero will be returned 
 
  for (let i = 0; i < arr.length; i++) { 
    let sumFixedStart = 0; 
    pre.textContent += `Try partial sums starting from index ${i} (${arr[i]})\n`; 
    for (let j = i; j < arr.length; j++) { 
      sumFixedStart += arr[j]; 
      pre.textContent += `\tMath.max(${maxSum}, ${arr.slice(i, j+1).join('+')}=${sumFixedStart}) = ${Math.max(maxSum, sumFixedStart)}\n`; 
      maxSum = Math.max(maxSum, sumFixedStart); 
    } 
  } 
 
  return maxSum; 
} 
;[ 
  [-1, 2, 3, -9], 
  [-1, 2, 3, -9, 11], 
  [-2, -1, 1, 2], 
  [1, 2, 3], 
  [100, -9, 2, -3, 5], 
].forEach(testCase => { 
  pre.textContent += `Solve case: ${JSON.stringify(testCase)}\n`; 
  let res = getMaxSubSum(testCase); 
  pre.textContent += `Result is ${res}\n--\n`; 
});
<pre></pre>

READ ALSO
Некорректная работа баллона на iPhone 5S/SE

Некорректная работа баллона на iPhone 5S/SE

При открытии баллона на iPhone 5S/SE содержимое, которое должно отображаться в нижней части карты уплываем ниже контейнера карты и как следствие...

81
CORS + AXIOS+REACTJS

CORS + AXIOS+REACTJS

Пишу клиента, используя ReactJS, для http запросов использую axios, делаю пост запрос к серверу, на сервере запрос обрабатывается и возвращает данные...

119
fontawesome в Заголовке браузера

fontawesome в Заголовке браузера

Поставил на сайт шрифт fontawesome поставил иконки в названиях категорий но возник вопрос: в браузерной строке он не отображается как надо - вместо...

120