Bardzo proste ćwiczenie – sumujemy cyfry w liczbie rekurencyjnie. Do dzieła!

Ok, podejście 1:

function sumOfDigits_v1(num){

    if(num === 0)
        return 0;

    return num % 10 + sumOfDigits_v1(Math.floor(num / 10));
}


console.log(sumOfDigits_v1(0)); //0
console.log(sumOfDigits_v1(1)); //1 
console.log(sumOfDigits_v1(12)); //3
console.log(sumOfDigits_v1(123)); //6
console.log(sumOfDigits_v1(1231)); //7

W tym podejściu (jako programiści powinniśmy ogarniać takie rzeczy, tu nie chodzi o optymalizację, ale zrozumienie mechanizmu):

  • Zawsze robimy + 0 na końcu
  • Zawsze robimy mod 10 na liczbie jednocyfrowej i od 10 mniejszej w przedostatnim podejściu (n mod m = n jeżeli n < m, tak to chyba działa)

Krótko mówiąc możemy pozbyć się + 0 i na przykład nie robić 9 mod 10, 0 mod 10, 3 mod 10, tylko po prostu zwrócić jednocyfrową.

I tak to wygląda w kodzie:

function sumOfDigits_v2(num){

    if(num < 10)
        return num;

    return num % 10 + sumOfDigits_v2(Math.floor(num / 10));
}


console.log(sumOfDigits_v2(0)); //0
console.log(sumOfDigits_v2(1)); //1 
console.log(sumOfDigits_v2(12)); //3
console.log(sumOfDigits_v2(123)); //6
console.log(sumOfDigits_v2(1231)); //7

Podkreślam, to jest żadna optymalizacja, to nie o to chodzi. Chodzi o to, abyśmy rozumieli co robimy. Jak nie bardzo rozumiemy tak proste rzeczy, to te bardziej skomplikowane jeszcze bardziej „nie bardzo” będziemy rozumieć…

Oczywiście trzeba ćwiczyć i się nie zrażać, to zawsze tak wygląda…