Problem:

Given a non-negative int n, compute recursively (no loops) the count of the occurrences of 8 as a digit, except that an 8 with another 8 immediately to its left counts double, so 8818 yields 4. Note that mod (%) by 10 yields the rightmost digit (126 % 10 is 6), while divide (/) by 10 removes the rightmost digit (126 / 10 is 12).

count8(8) → 1
count8(818) → 2
count8(8818) → 4

Solution:

public int count8(int n) {
if (n < 1) return 0;
if (n % 10 == 8 && (n / 10) % 10 == 8) return 2 + count8(n/10);
else if (n % 10 == 8) return 1 + count8(n/10);
else return count8(n/10);
}

1. public int count8(int n) {
if(n == 0) return 0;
if(n % 10 == 8 && n % 100 == 88) return 2 + count8(n / 10);
if(n % 10 == 8) return 1 + count8(n / 10);
return count8(n / 10);
}

1. n % 10 == 8 && n % 100 == 88
can be simplified to just
n % 100 == 88
because if the 2nd statement is true, the first one is always true too.

2. that's what i did

2. public int count8(int n) {
if (n < 10) return n == 8 ? 1 : 0;

if (n % 10 == 8 && (n / 10) % 10 == 8) return 2 + count8(n / 10);

return count8(n % 10) + count8(n / 10);
}

3. public int count8(int n) {
if(n == 0) return 0;
if(n % 100 == 88) return 2 + count8(n/10);
if(n % 10 == 8) return 1 + count8(n/10);
return count8(n/10);
}

4. public int count8(int n) {
int count = 0;
if(n == 0) return 0;
if(n%10 == 8) {
if((n/10)%10 == 8){
count++;
}
count++;
}
count += count8(n/10);
return count;
}

5. public int count8(int n) {
int count = 0;
if (n > 1) {
if (n>10) {
int newN = n/10;
if (n%10 == 8 && (newN%10) == 8) {
count += 2;
return count + count8(n/10);
}
}
if (n%10 == 8) {
count++;
return count + count8(n/10);
}
else {
return count + count8(n/10);
}
}
return count;
}

6. if(n<1) return 0;
if(n%100==88) return 2+count8(n/10);
if(n%10==8) return 1+count8(n/10);
else return count8(n/10);