2013-10-22 50 views
0

我必须使用递归解决这个问题,我设法使它很快地工作,但我有点卡住了这一点。 我当前的代码是JAVA:帮助修复递归函数

public static String ReverseR(String n){ 
    String finalstring=""; 
    int i = 0; 
    int len = n.length(); 
    while (i < len) { 
     finalstring += (n.charAt(len - 1)); 
     ReverseR(n.substring(0, len - 1)); 
     i++; 
    } 
    return finalstring; 
} 

当我输入任何字符串,结果字符串的长度是否正确,但仅使用最后一个字母。例如:ReverseR(“你好”)= ooooo 有什么想法?

+0

查看此链接寻求递归帮助:http://stackoverflow.com/questions/19526274/java-help-fixing-recursive-function – Tenner

+2

使用循环或递归。不是都。 –

回答

1

变化n.charAt(len - 1))n.charAt(len - i))

您一直都在与LEN -1同一个地方;)

[编辑]

while (i < len){ 
    finalstring += (n.charAt(len - 1 - i)); 
    ReverseR(n.substring(0, len - 1 - i)); 
    i++; 
} 

这将解决你的代码,但是你必须选择whileReverseR(...)

重复的问题,请检查此Reversing a String with Recursion in Java

+1

虽然这确实解决了问题,但是它不需要递归:)(这可能是OP作业所需的)。 – jtahlborn

+1

这将抛出'StringIndexOutOfBoundsException' –

5

递归有点像归纳法证明。

  1. 摆脱while循环的
  2. 如果要反转0个字符的字符串,这很简单:只返回“”
  3. 如果你是一个反转正字符串,反转[ 0..n-2]并在最后一个字母前加上。你已经在做什么了。
+2

也“记住,在Java中的字符串不可变,你需要_return_修改后的字符串” – jtahlborn

+0

感谢您的反馈,我会牢记在心。 – Howcan

0

这里是一个完全可行的解决方案

public static String reverse(final String s) { 
    if (s == null) { 
     throw new NullPointerException(); 
    } 

    final int length = s.length(); 
    if (length <= 1) { 
     return s; 
    } else { 
     // s = start + lastChar 
     final String start = s.substring(0, length - 1); 
     final char lastChar = s.charAt(length - 1); 
     return lastChar + reverse(start); 
    } 
} 
0

你的递归算法不应要求任何循环,即whilefor循环。任何循环结构本质上都可以通过递归实现,而不会触及循环。基本递归字符串逆转的例子可能是这样的:

public static String reverseR(String n){ 
    if (n.length() <= 1) return n; 
    return reverseR(n.substring(1))+n.charAt(0); 
} 

有了这个算法,你基本上说: 回报“的每一个字母的反转,但第一个” +“的第一个字母”

写一个递归算法有助于做出很多假设。首先假设你的反转函数起作用,然后把它放在自身的任何位置,只要你想扭转你的一部分字符串。只要记得添加一个基本案例,你就会变得金黄。语言如HaskellProlog将使您习惯于递归算法,因为这是他们的主要迭代源。

+0

从这里复制代码http://stackoverflow.com/questions/9723912/reversing-a-string-recursion-java –

+0

啊,很好找。看起来这是一个很常见的做法! – user2466999