Рекурсивное сложение всех цифр числа

Возникла необходимость в реализации алгоритма сложения всех цифр числа до тех пор, пока не получится однозначное.

Пояснение задачи

Имеется некое число, требуется получить сумму его цифр. Если в результате сложения получено не однозначное число — процедура сложения цифр повторяется уже для полученной суммы. И так до тех пор, пока на выходе не получится однозначное число.

Рассмотрим на примере произвольного числа 50349814743854.

Выполняем последовательное сложение всех цифр:

50349814743854 → 5 + 0 + 3 + 4 + 9 + 8 + 1 + 4 + 7 + 4 + 3 + 8 + 5 + 4 = 65

Полученная сумма 65 не является однозначным числом, повторяем процедуру.

65 → 6 + 5 = 11

Снова получено двузначное число. Производим еще одну итерацию.

11 → 1 + 1 = 2

Число 2 является однозначным. Ответ получен.

Функция

В связи с тем, что количество итераций неизвестно и на каждой последующей используется один и тот же алгоритм, очевидно, что проще всего с этим справится рекурсивная функция.

Автор приводит два варианта:

С помощью перебора цифр числа как символов в строке, с последующим преобразованием в цифру и суммированием.

function getSumViaStrings(num) {
    var strNum = num.toString();
    var strLen = strNum.length;
    var sum = 0;

    for (var i = 0; i < strLen; i++) {
        sum += parseInt(strNum[i]);
    }

    return sum < 10 ? sum : getSumViaStrings(sum);
}

С помощью суммирования остатка от деления числа на десять.

function getSumViaDivision(num) {
    var sum = 0;
    var tmpNum = num;

    do {
        sum += tmpNum % 10;
        tmpNum = parseInt((tmpNum / 10));
    }
    while (tmpNum > 10);

    return sum < 10 ? sum : getSumViaDivision(sum);
}

Производительность

Применив один из методов генерации случайных чисел можно оценить производительность.

Результат тестирования рекурсивных функций получения суммы цифр числа:
Разница производительности двух функций

Произвести тест самостоятельно можно c помощью заготовки на [JSPerf](http://jsperf.com/recursive-sum-of-all-digits).