JAVA:帮助修复递归函数

时间:2013-10-22 19:09:27

标签: java recursion

我必须使用递归来解决这个问题,我设法让它很快就能使用循环,但是我有点困惑于此。 我目前的代码是

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 有什么想法吗?

4 个答案:

答案 0 :(得分:5)

递归有点像感应证明。

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

答案 1 :(得分: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

答案 2 :(得分: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);
    }
}

答案 3 :(得分:0)

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

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

使用此算法,您基本上会说: 返回“每个字母的反面,但第一个字母”+“第一个字母”

帮助编写递归算法的一个好处是做了很多假设。首先假设你的反向函数有效,然后将它放在你想要反转字符串一部分的任何地方。只记得添加一个基础案例,你将是金色的。 HaskellProlog等语言会让您习惯递归算法,因为这是迭代的主要来源。