如何使用递归循环从char []数组返回一个字符串。(java)

时间:2011-01-08 09:42:53

标签: java string recursion char

我在递归时非常糟糕......

我需要将char[]数组(仅使用递归)转换为字符串 - 而不使用for()while()等循环。例如,如果我有一个char数组:

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 个答案:

答案 0 :(得分:1)

如果你有new String(char[])

,为什么这样做呢?

使用递归,

我强烈建议您在提交硬件之前了解recursion和此代码。

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));
    }
}

答案 1 :(得分:1)

在递归中,方法使用原始调用的修改数据调用自身。这样做直到达到一些基本情况,其中不再可能修改数据。

在你的情况下,基本情况是char数组只包含一个元素。这个char将是String。否则,它是第一个在递归调用中附加其余元素的元素。

字符串"Hello"'H',附加toFormattedString({'e','l','l','o'})。因此,如果您的char数组只包含一个元素(length==1),则只需将此元素作为String值返回。

否则取第一个元素并递归到没有第一个元素的剩余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)));

更新switch - 语句在此示例中提供了可读代码:

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()));
}

答案 2 :(得分:0)

public String toFormattedString(char ch []){ if(ch.length< = 0)返回“”;返回ch [0] +(toFormattedString(new String(ch).substring(1).toCharArray()));}

答案 3 :(得分:0)

又一个答案。

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);
}

我不知道这是一个“格式化”的字符串。没有格式,它只是一个字符串。