在java中以递归方式交换字符串中的字母对

时间:2012-02-16 23:16:13

标签: java string recursion

例如,如果我调用exchangePairs(“abcdefg”),我应该收到“badcfeg”作为回报。

这是一个家庭作业,任何类型的伪代码都会非常有用。我刚刚开始学习递归,直到这个问题,我没有太多的问题。

8 个答案:

答案 0 :(得分:6)

public String swapPairs(String s) {
     if (s.length() < 2)
          return s;
     else
          return swap(s.charAt(0), s.charAt(1)) + swapPairs(s.substring(2));
}

答案 1 :(得分:1)

你不仅仅是开始学习递归,因为递归是你日常生活的一部分。你只是没注意到,因为它是如此正常,没有人称之为递归。

例如,您在电视上观看电影,在一个场景中有人在电视上观看电影。

在编程中,递归是一种简单易行的方法。总是从简单的案例开始:

  • exchangePairs(“”)的结果是什么?
  • exchangePairs(“x”)的结果是什么,其中x是任何字符?
  • 假设您已经完成了exchangePairs(),结果如何为“xy ...”,其中“...”是任何字符串?肯定是“yx +++”,其中“+++”是exchangePairs(“......”)的结果。

现在,事实证明我们已经涵盖了所有案例!问题解决了! 这就是递归的伟大之处。你只是使用你的功能就好像它已经完成,尽管你还没有完成它。

答案 2 :(得分:0)

为什么要使用递归?

for (int i = 0; i + 1 < strlen(str); ++i) {
    char tmp = str[i + 1];
    str[i + 1] = str[i];
    str[i] = tmp;
} 

如果你必须使用递归,我想你可以这样做:

char* exchangePairs(char* str) {
    if (strlen(str) >= 2) {
        // if there are characters left, swap the first two, then recurse
        char tmp = str[1];
        str[1] = str[0];
        str[0] = str[1];

        exchangePairs(str + 2);
    }

    return str;
}

那是在C中,但它应该给你一个想法(我在C中更好,并且不想只给你一个复制/可粘贴的解决方案)。

答案 3 :(得分:0)

使用尾递归

String reverse(String input)
{
   if(String.length()==1)
   {
     return input;
   }
   else
   {
      return reverse(input,"");
   }
}

String reverse(String input, String result)
{
   if(input.length == 0) return result;
   else return result(input.substring(1),input.charAt(0) + result);
}

答案 4 :(得分:0)

好这是我的解决方案。我没有Java可供使用,所以我在C#中使用它非常类似于Java,所以应该很容易理解/端口;

 public static char[] exchangePairs(char[] charArray, int current)
        {
            if(current >= charArray.Length - 1)
            {
                return charArray;
            }

            char nextChar = charArray[current + 1];
            char currentChar = charArray[current];

            charArray[current] = nextChar;
            charArray[current + 1] = currentChar;

            int i = current + 2;

            return exchangePairs(charArray, i);
        }

调用方法:

exchangePairs(“abcdefghij”.ToCharArray(),0);

答案 5 :(得分:0)

public static String swapPairs(String s) {
    String even = "";
    String odd = "";
    int length = s.length();

    for (int i = 0; i <= length-2; i+=2) {          
        even += s.charAt(i+1) + "" + s.charAt(i);
    }

    if (length % 2 != 0) {          
        odd = even + s.charAt(length-1);
        return odd;
    } else {
        return even;
    }
}

答案 6 :(得分:0)

对Steven解决方案的一个小补充,您可以使用StringBuffer / StringBuilder.reverse()来反转字符串。

 public String swapPairs(String s) {
    if (s.length() < 2)
        return s;
    else {
        return new StringBuffer(s.substring(0, 2)).reverse().toString() + swapPairs(s.substring(2));
    }
}

答案 7 :(得分:-2)

我将引入一个整数递归控制变量,它是已经交换了多少字符串。在每个级别,检查控制变量以查看是否还有其他操作,如果有,则交换下一对,递增2并递归。