mystery1 method

public static int countOddDigits(int n)
{
    if(n == 0)
        return 0;
    
    if(n % 2 == 1)
        return 1 + countOddDigits(n / 10);
    else
        return countOddDigits(n / 10);
}

The method counts and returns the number of odd digits in its parameter n.

The base case is n == 0. The method returns 0 because 0 has 0 odd digits.

In both the if and else, the method is called with n / 10, which is n without its last (least significant, rightmost) digit.

During 1 step, the method checks if n is odd (n % 2 == 1). If n is odd, it adds 1 to the result of the recursive call. If n is not odd (even), it does not add 1. Adding 1 to the result each time something is true means the method is counting something. It adds 1 when the digit is odd (see below), so it is counting the number of odd digits.

A common mistake is thinking that the method adds 1 to each odd digit, making the digit even. The method isn’t adding 1 to n / 10 or n % 10. The method is adding 1 to the result of the recursive call with n / 10.

The conditional statement could be written as:

if((n % 10) % 2 == 1)

The last digit of n is what determines if n is odd.

mystery2 solution
Exercises
All solutions