В рекурсии метод вызывает сам себя с измененными данными исходного вызова.Это делается до тех пор, пока не будет достигнут некоторый базовый случай, в котором больше невозможно изменить данные.
В вашем случае базовый случай - это когда массив char состоит только из одного элемента.Этот символ будет строкой.В противном случае это первый элемент с остальными, добавленными в рекурсивный вызов.
Строка "Hello"
равна 'H'
с добавлением toFormattedString({'e','l','l','o'})
.Поэтому, если ваш массив char содержит только один элемент (length==1)
, просто верните этот элемент как строковое значение.
В противном случае возьмите первый элемент и перейдите рекурсивно к оставшемуся массиву char без первого элемента.Рекурсивный, пока не останется только один элемент.
public static String toFormattedString(char[] a)
{
if (a.length==1) return String.valueOf(a[0]);
else
return a[0]+toFormattedString(Arrays.copyOfRange(a,1,a.length)) ;
}
Вы даже можете поместить тело метода в одну нечитаемую строку (не рекомендуется, я упомянул это просто для забавы):
return((a.length==1)?String.valueOf(a[0]):a[0]+toFormattedString(Arrays.copyOfRange(a,1,a.length)));
ОБНОВЛЕНИЕ: Aswitch
-статмент дает читабельный код в этом примере:
public static String toFormattedString(char[] a)
{
switch (a.length)
{case 0 : return "";
case 1 : return String.valueOf(a[0]);
default: return a[0]+toFormattedString(Arrays.copyOfRange(a,1,a.length));
}
}
Использование:
public static void main (String[] args) throws java.lang.Exception
{
System.out.println(toFormattedString("Hello".toCharArray()));
}