我在递归时非常糟糕......
我需要将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];
答案 0 :(得分:1)
使用递归,
我强烈建议您在提交硬件之前了解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);
}
我不知道这是一个“格式化”的字符串。没有格式,它只是一个字符串。