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…