В этой статье мы поговорим о проблеме 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)));