Как вернуть строку из массива char [], используя цикл рекурсии. (Java) - PullRequest
0 голосов
/ 08 января 2011

Я очень плох в рекурсии ...

Мне нужно преобразовать массив char[], используя только рекурсию, в строку - без использования циклов for(), while() и т. Д.Например, если у меня есть массив символов:

a[0]='H', a[1]='e', a[2]='l',a[3]= 'l',a[4]= 'o'

, он возвращает H e l l o.

Что я делаю не так?

 public String toFormattedString(char[] a)
 {
      int temp =a.length;
      if (a == null)
       return "null";
      if (a.length == 0)
       return "0";
       if( a.length == 1 )
           else  if( a[0] == a[a.length] )
         return toFormattedString (a[a.length -1])+a[a.length];

Ответы [ 4 ]

1 голос
/ 08 января 2011

В рекурсии метод вызывает сам себя с измененными данными исходного вызова.Это делается до тех пор, пока не будет достигнут некоторый базовый случай, в котором больше невозможно изменить данные.

В вашем случае базовый случай - это когда массив 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()));
}
1 голос
/ 08 января 2011

Зачем делать это, если у вас есть new String(char[])

Использование рекурсии,

Я бы настоятельно рекомендовал вам понять рекурсию и этот код задолго до того, как вы отправите свое HW.

package org.life.java.so.questions;

/**
 *
 * @author Jigar
 */
public class StringCharRec {

    public static String toStringFromCharArr(String str, char[] arr, int pos) {
        if (pos == arr.length) {

            return str;
        }
        str += Character.toString(arr[pos]);
        return toStringFromCharArr(str, arr, ++pos);


    }

    public static void main(String[] args) {
        char[] ar = {'a', 'b', 'c'};
        System.out.println(toStringFromCharArr(new String(), ar, 0));
    }
}
0 голосов
/ 08 января 2011

Еще один ответ.

public String toFormattedString(char[] a) {
   return a == null ? "null" : toFormattedString(a, 0);
}

private String toFormattedString(char[] a, int pos) {
   return pos >= a.length ? "" : a[pos] + toFormattedString(a, pos+1);
}

Это делит строку пополам каждый раз. Это не взорвется на длинных струнах. (Выполнение одного символа за раз может привести к StackOverFlowError;)

public String toFormattedString(char[] a) {
   return a == null ? "null" : toFormattedString(a, 0, a.length);
}

private String toFormattedString(char[] a, int start, int end) {
   int len = end-start;
   return len==0?"":len==1?""+a[start]:
     toFormattedString(a,start,start+len/2)+toFormattedString(a,start+len/2,end);
}

Я не вижу, как это "отформатированная" строка. Там нет форматирования, это просто строка.

0 голосов
/ 08 января 2011

public String toFormattedString (char ch []) { if (ch.length <= 0) return ""; return ch [0] + (toFormattedString (new String (ch) .substring (1) .toCharArray ()));} </p>

...