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.