Java 递归,单词镜像本身

Java 递归,单词镜像本身,java,recursion,Java,Recursion,我试图编写一个递归,其中一个单词试图镜像自己(appleelppa)。我的思维过程是使用递归,以相反的顺序打印出单词,然后在开头添加单词。然而,这并没有以某种方式起作用。这是我的密码 public static String reverse(String str) { if ((null == str) || (str.length() <= 1)) { return str; } return str + reverse(str.substring(1)) + str.char

我试图编写一个递归,其中一个单词试图镜像自己(appleelppa)。我的思维过程是使用递归,以相反的顺序打印出单词,然后在开头添加单词。然而,这并没有以某种方式起作用。这是我的密码

public static String reverse(String str) {
if ((null == str) || (str.length()  <= 1)) {
    return str;
}
return str + reverse(str.substring(1)) + str.charAt(0);
}
publicstaticstringreverse(stringstr){

如果((null==str)| |(str.length()只需编写一个递归函数来反转字符串,然后将其添加到原始字符串中,就会简单得多

public class Reverse{
    public static String reverse(String str) {
        if ((null == str) || (str.length()  <= 1)) {
            return str;
        }
        return reverse(str.substring(1)) + str.charAt(0);
    }
    public static void main(String[] args) {
        System.out.println("appleelppa" + reverse("appleelppa"));
    }
}
公共类反向{
公共静态字符串反转(字符串str){

如果((null==str)| |(str.length()您的
reverse
例程几乎是正确的(但您确实应该添加
mirror
例程,您的方法会像现在一样混乱)。您希望这样

// Reverse the input String str.
private static String reverse(String str) {
  // This just looked ugly.
  if (str == null || str.length() <= 1) {
    return str;
  }
  // this is how you recursively reverse the word.
  return reverse(str.substring(1)) + str.charAt(0);
}

// mirror is trivial, the word and the reverse of the word.
public static String mirror(String str) {
  return str + reverse(str);
}

public static void main(String[] args) {
  String str = "apple";
  System.out.println(mirror(str));
}
编辑

// mirror an input string iteratively.
public static String mirror(String str) {
  // return str + reverse(str);
  StringBuilder sb = new StringBuilder(str);
  return str + sb.reverse().toString();
}

所有给你的答案都给了你新的解决方案。我在这里告诉你你的解决方案是90%正确的

从以下位置删除
str+

return str + reverse(str.substring(1)) + str.charAt(0);
使:

return reverse(str.substring(1)) + str.charAt(0);

您的原始函数工作起来很有魅力;)

另一种不难看的递归方法:

public static String mirror(String s) {
    if (s == null || s.isEmpty()) {
        return "";
    }
    return s.charAt(0) + mirror(s.substring(1)) + s.charAt(0);
}
简言之,镜像字符串意味着拥有一个包含第一个字符的字符串,然后是镜像后的剩余字符串,然后是第一个字符


(编辑:刚刚用我测试过的实际代码更新了哪些代码有效)

这不是“递归”,而是“递归函数/方法”。我在我的答案中添加了难看的hack,所以你可以看到它看起来有多难看。:p这起作用,因为问题是你在添加任何被传递到reverse的东西到它的“reverse”依此类推。如果你按照这个答案的建议去做,从开头删除
str+
,然后用:
origStr+reverse(origStr)开始递归调用
让reverse返回字符串的倒数。如果我想让它与递归方法位于同一行,我该怎么办?@user3496026,“同一行”是什么意思就像在同一个方法中一样。@user3496026,正如您在另一个答案中所看到的,两个方法是首选方法,但您可以强制使用。我将进行更新,让您看看它有多难看。如果我希望它在同一个方法中,该怎么办?我是否必须编写一些全新的内容?当然,以迭代的方式进行。您肯定可以使用一个具有一些丑陋的技巧:只需传递一个额外的标志来表示您是否在第一次方法调用中。仅当第一次调用时才打印原始字符串。老实说,这只会使您的代码丑陋且难以维护。使用2方法是一种寻求迭代解的方法,它不会增加堆栈,也不需要额外的反向路由e、 @ElliottFrisch如果您使用的是StringBuilder,我认为简单地编写就更容易了:
返回新的StringBuilder.append(str).append(new StringBuilder(str.reverse()).toString();
StringBuilder已经提供了一个可以使用的反向方法
return reverse(str.substring(1)) + str.charAt(0);
public static String mirror(String s) {
    if (s == null || s.isEmpty()) {
        return "";
    }
    return s.charAt(0) + mirror(s.substring(1)) + s.charAt(0);
}