2017-02-21 6 views
0

Кажется, что компилятор не входит в цикл for. Сумма массива вычисляется. SumAll ([1,4]) должен возвращать 10 (1 + 2 + 3 + 4) в качестве выхода.Сумма рассчитывается для чисел между максимальным и минимальным значениями массива. Например: [1,4] должен возвращать 1 + 2 + 3 + 4 = 10

function sumAll(arr) { 
     //return Math.max.apply(Math,arr); 
     //return Math.min.apply(Math,arr); 

     // return "0"; 
     var sum=arr.reduce(function(a,b){ 
      for(var i=Math.min.apply(Math,arr);i<=Math.max.apply(Math,arr);i++){ 
     return a+b; 
     } 
     },0); 
     //return sum; 
    } 

    sumAll([1, 4]); 
+0

ничего не возвращается. За цикл не выполняется. @Rajesh – aayushi

+3

Вы также можете использовать формулу, сумму первых n натуральных чисел = n * (n + 1)/2: P –

+0

Цикл 'for' не выполняется, потому что вы возвращаетесь от него на первой итерации. @aayushi –

ответ

1

Вы можете попробовать что-то вроде этого:

Примечание: ваш массив имеет пределы диапазона, поэтому вы должны использовать эти значения для цикла и использовать i для расчета суммы.

Образец

Для петли

function getSumOfRange(arr){ 
 
    var min = Math.min.apply(null, arr) 
 
    var max = Math.max.apply(null, arr); 
 
    
 
    var sum = 0; 
 
    for(var i=min; i<= max; i++){ 
 
    sum+=i; 
 
    } 
 
    return sum; 
 
} 
 

 
console.log(getSumOfRange([1,4]))

Формула на основе

function getSumOfRange(arr){ 
 
    var min = Math.min.apply(null, arr) 
 
    var max = Math.max.apply(null, arr); 
 
    var diff = (max-min) + 1; 
 
    var sum = (min + max); 
 
    var total = sum * Math.floor(diff/2) 
 
    return diff % 2 === 0 ? total : total + (sum/2); 
 
} 
 

 
console.log(getSumOfRange([1,4])) 
 
console.log(getSumOfRange([10,40]))


объяснение вашего кода

function sumAll(arr) { 
 
    var sum = arr.reduce(function(a, b) { 
 
    // Loop will only run once as you are returning 
 
    for (var i = Math.min.apply(Math, arr); i <= Math.max.apply(Math, arr); i++) { 
 
     // 1st Time: a=0; b=1; 
 
     // 2nd Time: a=1; b=4; 
 
     return a + b; 
 
    } 
 
    }, 0); 
 
    
 
    // Sum = 5 and not 10; 
 
    
 
    // You have commented return hence no output is given back. 
 
    //return sum; 
 
} 
 

 
sumAll([1, 4]);

+0

Как значения a и b меняют уменьшение()? @rajesh – aayushi

+0

'a' будет удерживать * начальное значение * для первой итерации и * возвращаемое значение предыдущей итерации * для других итераций. 'b' будет содержать значение элемента – Rajesh

+0

@aayushi. Для получения дополнительной информации вы можете обратиться к [answer] (http://stackoverflow.com/a/40146799/3783478). – Rajesh

5

Вы можете использовать непосредственно значения из массива, без снижения.

function sumAll(arr) { 
 
    var i, sum = 0; 
 
    for (i = Math.min.apply(null, arr); i <= Math.max.apply(null, arr); i++) { 
 
     sum += i; 
 
    } 
 
    return sum; 
 
} 
 

 
console.log(sumAll([1, 4])); 
 
console.log(sumAll([1, 3, 9]));

+0

Почему используется «Math.min.apply (null, arr)» и Math.max.apply (null, arr)? –

+0

Чтобы получить значения min и max в массиве – Rajesh

+0

, необходимо получить из массива значения min и max. ['Функция # apply'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply) использует в качестве аргументов объект и массив как параметр для вызова. –

0

Есть 2 способа сделать это.

  1. Использование математической формулы n1 + (n1 + 1) + ... + n2 = n2(n2 + 1)/2 - n1(n1 - 1)/2. Сложность времени: O (1)
  2. Программно. Временная сложность: О (п)

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

function sumAllMath(arr) { 
 
    if (!(Array.isArray(arr) 
 
     && arr.length === 2 
 
     && typeof arr[0] === 'number' 
 
     && typeof arr[1] === 'number' 
 
     && arr[0] < arr[1])) { 
 
     return; 
 
    } 
 
    
 
    var from = arr[0]; 
 
    var to = arr[1]; 
 
    return ((to * (to + 1))/2) - ((from * (from - 1))/2); 
 
} 
 

 
console.log(sumAllMath([1,4])) 
 

 
function sumAll(arr) { 
 
    if (!(Array.isArray(arr) 
 
     && arr.length === 2 
 
     && typeof arr[0] === 'number' 
 
     && typeof arr[1] === 'number' 
 
     && arr[0] < arr[1])) { 
 
     return; 
 
    } 
 
    
 
    var sum = 0; 
 
    var from = arr[0]; 
 
    var to = arr[1]; 
 
    while(from <= to) { 
 
    sum += from; 
 
    ++from; 
 
    } 
 
    
 
    return sum; 
 
} 
 

 
console.log(sumAll([1,4]))

+0

Сложность времени на самом деле не является 'O (1)', потому что вам все равно нужно определить максимальное и минимальное значение в массиве (которое вы как-то проигнорировали), но формула, безусловно, путь! – Thilo

+0

Существует недоразумение в вопросе. Я понимаю, что в массиве всегда есть 2 числа с форматом: [minNumber, maxNumber]. Таким образом, вам не нужно искать номера в массиве. – Apostolidis

+0

Что еще более важно, даже если мы хотим включить поиск экстремумов массива, это все еще только «O (n)» в длине массива, а не в размере самих чисел (например, цикл быть). Поэтому, если вы даете верхнюю оценку длины массива (например, двух ...), она по-прежнему эффективно «O (1)». – Thilo

3

Вам не нужно reduce, потому что у вас нет массива, чтобы уменьшить. Однако вы можете сохранить цикл for и аккумулировать сумму, добавив i в sum на каждой итерации. Проблема заключалась в том, что вы:

  • Используется и ненужными уменьшить
  • был return сразу ИНГ из для цикла, поэтому не накопление суммы не происходит.

Вот что код должен выглядеть следующим образом:

function sumAll(arr) { 
 

 
    var sum = 0; 
 
    for (var i = Math.min.apply(Math, arr); i <= Math.max.apply(Math, arr); i++) { 
 
    sum += i; 
 
    } 
 

 
    return sum; 
 
} 
 

 
console.log(sumAll([1, 4]));

+0

Если это нужно сделать с помощью функции reduce(), каков будет код? @Hitscotty – aayushi

+1

@aayushi: Чтобы свести к минимуму необходимость создания массива всех чисел между 'min' и' max'. Затем вы можете реализовать 'sum [1,2,3,4,5]' как 'reduce (+) 0 [1,2,3,4,5]'. Но это немного сумасшествие. – Thilo

+0

понимается! Благодаря @Thilo – aayushi

1

Кажется, никто не хочет использовать формулу для суммы первых N натуральных чисел:

function sumAll(arr) { 
    let start = Math.min.apply(Math, arr); 
    let end = Math.max.apply(Math, arr); 
    return (end * (end+1) - start * (start-1))/2; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^