Почему вы пытаетесь избежать петли? Я имею в виду, что вы не можете сосчитать точки «numberOf», не проверив каждый отдельный символ строки, и если вы вызовете какую-либо функцию, она каким-то образом зациклится. Это значит, что String.replace должен выполнить цикл, проверяющий, появляется ли строка, чтобы она могла заменить каждое вхождение.
Если вы пытаетесь сократить использование ресурсов, вы не будете этого делать, потому что вы создаете новую строку только для подсчета точек.
Теперь, если мы поговорим о рекурсивном методе "введите код здесь", кто-то сказал, что он потерпит неудачу из-за OutOfMemmoryException, я думаю, он забыл StackOverflowException.
Итак, мой метод будет таким (я знаю, что он похож на другие, но эта проблема требует цикла):
public static int numberOf(String str,int c) {
int res=0;
if(str==null)
return res;
for(int i=0;i<str.length();i++)
if(c==str.charAt(i))
res++;
return res;
}