2017-01-25 2 views
0

Хотя этот ответ на этот вопрос here был наилучший ответ из-за рекурсии аспекте,Понимание другого фрагмента кода Javascript, который добавить цифры из числа

function sumDigits(number) { 
    var remainder = number % 10; 
    var sum = remainder; 
    if(number >= 10) { 
     var rest = Math.floor(number/10); 
     sum += sumDigits(rest); 
    } 
    return sum; 
} 

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

function sumDigits(number) { 
    var sum = 0; 
    var numbers = number.toString().split(""); //turn the number to string and split the number in several digits 

    while(numbers.length > 0) { 
    sum += parseInt(numbers[0], 10); // covert string to number and force the number to be decimal and add the next number 
    numbers.splice(0, 1); //remove the first digit, in other words, removing "0" from sum, i think? 
    sumDigits(numbers.join('')); //join the array element into a string 
    } 

    return sum; 
} 

var sum = sumDigits(175); 
$('#result').html(sum); 

Вот что я был в состоянии понять:

var numbers = number.toString().split(""); 

преобразовать число в строку и разбить строку на массив подстрок. Другими словами, если число 175, то он будет преобразован в «175» и разделить на 1, 7, 5. Далее

while(numbers.length > 0) { 

Это гарантировало, что число является положительным и может быть добавлен. Однако, когда я удалил эту строку и запустил ее в JS Bin с отрицательным числом, она возвращает ошибку. Итак, так или иначе, это важно, чтобы суммировать только положительные числа. Далее

sum += parseInt(numbers[0], 10); 

Это (ParseInt) преобразовать строку или в нашем случае, подстроки, обратно в цифры и добавить каждый номер к себе. Однако я не понимаю, что «0» находится в скобках после номеров , если только это не относится к первому числу в массиве = [1, 7, 5] ?? Тем не менее, я вижу, что когда я удаляю [0] из этой строки, он возвращает ошибку. Дополнительно, с «суммы + =», следует добавлять его как этот 0 + 1 + 7 + 5. Таким образом, сумма 13. Далее,

numbers.splice(0, 1); 

Это та часть, которую я не Понимаю. Я знаю, что .splice либо добавляет, либо удаляет элементы. Например, первая часть (0,1), которая равна «0», находит положение массива, другими словами, «0» находит первую позицию до «1» в массиве = [1, 7 , 5]. Последняя часть, которая равна «1», указывает количество элементов, которые нужно удалить. Другими словами, он просит удалить «1» из массива, в результате чего массив будет [7, 5]. Тем не менее, я думаю, что это не нужно вообще, потому что нет необходимости удалять цифру из числа. Кроме того, я не понимаю комментарий, в котором говорится, что эта строка удаляет «0» из суммы, когда сумма должна быть равна 13? Далее,

sumDigits(numbers.join('')); 

Предполагается, что это объединение элементов массива в строку. Другими словами, он должен присоединиться к массиву = [1, 7, 5] в «1, 7, 5». Тем не менее, я не понимаю, почему эти две строки (.splice и .join) необходимы, когда эта строка (sum + = parseInt (числа [0])) преобразует строку обратно в числа и добавляет цифры вместе. Однако, когда я удалить эти две строки, функция не работает ...

Пожалуйста, помогите мне понять, как это работает, и что выполнение первого и так далее ...

+0

Почему бы не поставить пару 'console.log's туда и увидеть, что он делает? –

ответ

1

ничего себе, что ответ был умным !! Попробую объяснить: предположим, что у нас есть эта строка «3432»

первый раз мы запускаем функцию мы разделим его:

numbers = ['3','4','3','2'] 

то в этом цикле, мы будем делать часть самый искусный из процесса, пусть см:

while(numbers.length > 0) { //actually the condition here is number array has to have at least 1 element, we'll see why 
    sum += parseInt(numbers[0], 10); // covert string to number and force the number to be decimal and add the next number 
    //so sum = 0+3 
    numbers.splice(0, 1); //remove the first digit, in other words, removing "0" from sum, i think? 
    //then here you're right, we remove the first digit so that 
    number = ['4','3','2'] 
    sumDigits(numbers.join('')); //join the array element into a string 
    //and here we call recursively sumDigits passing "432" in arguments 
    /* so next time sum = 3+4, number = ['3','2'] and then 
we will call sumDigits again with "32" as arguments 
and then sum = 7+3, number = ['2'], and then 
we will call sumDigits again with "2" as arguments 
and then sum = 10+2 and number = [] and then we will call sumDigits again passing it "" and at that time the while loop break */ 

    } 
+0

Итак, это еще одна функция рекурсии, правильно? другими словами, повторение шагов снова и снова, пока в массиве нет элементов. –

+0

Dang! Я просто понял еще одну вещь! parseInt возвращает только первое число строки !!! Поэтому для удаления первого номера требуется .splice! –

+0

Я только что нашел более короткий метод во время учебы после того, как я разместил этот вопрос. Во время учебы я наткнулся на метод .reduce(), в котором он получает сумму чисел в массиве. Поэтому, чтобы использовать метод .reduce, вам нужно будет использовать .toString(). Split (""), чтобы сначала вернуть массив = ["3", "4", "3", "2"]. Затем используйте метод .reduce(). Наконец, нужно применить метод .Number() как для total, так и для currentValue, чтобы преобразовать «3» в 3. Вот пример: http://codepen.io/kikibres/pen/BpdXXq/ –

1

Вы получили это почти сразу ,

Базовый алгоритм используется для

  1. Преобразование числа в строку number.toString() и разделить эту строку в массив символов number.toString().split(""), каждый из которых представляет один разряд исходного числа

    var numbers = number.toString().split(""); 
    
  2. Хотя результирующий массив содержит больше нуля,

    while(numbers.length > 0) { 
    
  3. Преобразовать первый элемент массива numbers[0] ряда parseInt(numbers[0], 10) и добавить его в sum

    sum += parseInt(numbers[0], 10); 
    
  4. Удалить первый элемент из numbers

    numbers.splice(0, 1); 
    
  5. Вернитесь 2. и повторите с более коротким массивом numbers, если есть какие-либо элементы. Обратите внимание, что ранее второй элемент теперь первый элемент

  6. После numbers имеет нулевые элементы, возвращают sum


Этот шаг, как представляется, совершенно бесполезны и должны быть удалены:

sumDigits(numbers.join('')); 
+1

Разделение строки на массив символов вообще бесполезно, поскольку JavaScript обладает отлично способной функцией 'String.prototype.slice'. Я думаю, что автор этого кода слишком сильно задумался над этим. –

0
function addDigits(n) { 
    let str = n.toString().split(''); 
    let len = str.length; 
    let add, 
     acc = 0; 
for (i=0; i<=len-1; i++) { 
    acc += Number(str[i]); 
} 
return acc;  
} 
console.log(addDigits(123456789)); //Output: 45 
Смежные вопросы