В этой статье мы поговорим о проблеме JavaScript, которая представляет собой функцию диапазона и суммы в JavaScript. Эта проблема находится в главе 4 книги Eloquent JavaScript, которая, конечно же, очень известна для JS. Итак, мы поймем эту проблему, а также решим ее с помощью очень простой логики.
Проблема с диапазоном и функцией суммы
В предисловии к этой книге упоминался следующий способ вычисления суммы диапазона чисел:console.log(sum(range(1, 10)));
Напишите функцию range
, которая принимает два аргумента, start
и end
, и возвращает массив, содержащий все числа от start
до (включительно) end
.
Затем напишите функцию sum
, которая принимает массив чисел и возвращает сумму этих чисел. Запустите предыдущую программу и посмотрите, действительно ли она возвращает 55.
Диапазон и функция суммы Решение
Итак, теперь давайте создадим диапазон функций, в котором мы создадим массив, и мы присвоили значение start в переменной с именем cnt. Итак, здесь мы использовали цикл, чтобы мы могли присвоить все значения в массиве. Мы использовали цикл while, мы также можем использовать цикл for, здесь цикл будет выполняться до тех пор, пока cnt не станет меньше или равно end. В этом мы просто помещаем значение cnt в массив и увеличиваем cnt, наконец, мы просто возвращаем этот массив.
Теперь давайте создадим еще одну функцию с именем sum, чтобы получить сложение значений массива, здесь мы передали массив в качестве параметра функции. Теперь у нас есть переменная total с начальным значением 0, и снова мы использовали цикл while до длины массива, в котором мы просто извлекаем массив и добавляем итоговую переменную, и мы возвращаем total. Наконец, мы используем console.log с вызовами обеих функций, здесь мы передаем диапазон (1,10) в качестве аргумента в вызове функции суммы. Таким образом, функция диапазона будет вызвана первой и вернет массив, который будет использоваться функцией суммы.
const range = function(start, end) { var arr = [], cnt = start; while(cnt<=end){ arr.push(cnt); cnt++; } return arr; } const sum = function(arr){ var total = 0; while(arr.length>0){ total = total + arr.pop(); } return total; } console.log(sum(range(1,10)));
Диапазон и функция суммы Решение: альтернатива
Как мы знаем, JavaScript гибок, а это значит, что у нас может быть несколько способов решения одной проблемы. Итак, давайте поговорим об альтернативном способе, здесь мы полностью устраняем цикл, используя рекурсию функций. В функции диапазона мы объявили пустой массив и начало, назначенное cnt, теперь мы объявили другую функцию с именемувеличитьCnt, которая принимает cnt в качестве параметра. В этом мы проверим, где cnt больше, чем end, затем просто нажмем конечное значение и вернем массив. В противном случае нажмите cnt, и мы снова вызовем эту функцию с увеличенным значением cnt. Эта штука работает аналогично циклу, пока массив не вернется.
Теперь в функции суммы мы применили метод уменьшения массива и добавили функцию обратного вызова с двумя параметрами, и мы просто добавляем их оба и возвращаем их.
const range = function(start, end) { var arr = [], cnt = start; function increaseCnt(cnt){ if(cnt>=end){ return arr.push(end); } else{ arr.push(cnt); increaseCnt(++cnt); } } increaseCnt(cnt); return arr; } const sum = function(arr){ return arr.reduce(function(tot,val){ return tot + val; }) } console.log(sum(range(1,10)));