Это потому, что start++
сначала возвращает start
значение и , а затем увеличивает значение start
(это означает, что вы в основном вызываете рекурсивную функцию substring
с всегда одинаковыми параметрами start
значение) - вам нужно изменить это на ++start
return ""+s.charAt(start)+substring(s, ++start, stop); // or even better 'start + 1' because you don't need to increment this locally