Piszemy algorytm, który wylicza ilość cyfr w podanej liczbie za pomocą rekurencji. Do dzieła.
Pierwsze, niekoniecznie dobre, co może nam przyjść do głowy to coś takiego:
function numberOfDigits_bad(num){
if(num === 0)
return 0;
return 1 + numberOfDigits_bad(Math.floor(num /10));
}
console.log(numberOfDigits_bad(0)); //0
console.log(numberOfDigits_bad(1)); //1
console.log(numberOfDigits_bad(12)); //2
console.log(numberOfDigits_bad(123)); //3
Zero ma jedną cyfrę. Reszta się tutaj zgadza. Ok, to jaki base case?
Może taki, że 0 daje 1?
function numberOfDigits_bad(num){
if(num === 0)
return 1;
return 1 + numberOfDigits_bad(Math.floor(num /10));
}
console.log(numberOfDigits_bad(0)); //1
console.log(numberOfDigits_bad(1)); //2
console.log(numberOfDigits_bad(12)); //3
console.log(numberOfDigits_bad(123)); //4
Jeszcze gorzej, teraz tylko 0 się zgadza. Ok, pomyślmy tak:
- Jednocyfrowa liczba daje 1
- Wielocyfrowa daje 1 + liczba / 10 (o jedną cyfrę mniejsza)
- Wielocyfrowa to większa lub równa 10 (najmniejsza dwucyfrowa):
function numberOfDigits_good(num){
if(num >= 10)
return 1 + numberOfDigits_good(Math.floor(num / 10));
return 1;
}
console.log(numberOfDigits_good(0)); //1
console.log(numberOfDigits_good(1)); //1
console.log(numberOfDigits_good(12)); //2
console.log(numberOfDigits_good(123)); //3
Działa.