使用递归实现字符串逆序

使用递归实现字符串逆序

以下代码可以实现字符串逆序输出:

/** 对字符串s进行逆序,比如abcde逆序后为edcba */
public String reverse(String s) {
    return s.length() > 0 ? reverse(s.substring(1)) + s.charAt(0) : "";
}

比如执行方法reverse("abcde");,会返回结果edcba

怎么理解这个方法呢?

为了便于理解,我们把以上方法进行单行改造,改造后的造价方法如下:

/** 对字符串s进行逆序,比如abcde逆序后为edcba */
public static String reverse(String s) {
    boolean isNotEmpty = s.length() > 0;
    if (isNotEmpty) {
        String substring = s.substring(1);
        String reverse = reverse(substring);
        String result = reverse + s.charAt(0);
        return result;
    }
    return "";
}

然后对发造后的方法打断点进行Debug,即可弄清递归方法的执行流程。

比如执行reverse("abcde"),具体执行流程如下:

// 首先依次执行如下5个步骤,即方法递归了5次
1. substring("abcde");
2. substring("bcde");
3. substring("cde");
4. substring("de");
5. substring("e");

// 执行完以上5个步骤后,递归结束,方法开始返回,返回值依次为:
5. e
4. d
3. c
2. b
1. a

递归执行流程总结:

  1. 方法返回的顺序是与方法执行的顺序倒过来的;

  2. 即最后执行的方法,最先返回,最先执行的方法,最后返回;

  3. 递归方法执行与返回的整个过程,类似于一个入栈和出栈的过程。


使用递归实现数组逆序

思路:从两端向中间依次交换两端位置的值,直到交换完毕。比如一个长度为6的数组,则交换过程如下:

0:5 交换0和5位置的元素
1:4 交换4和4位置的元素
2:3 交换2和3位置的元素
3:2 交换完毕,退出递归

/**
 * 使用递归实现数组倒序;
 * 依次交换以下位置元素的值:
 * 第1个 与 倒数第1个
 * 第2个 与 倒数第2个
 * 第3个 与 倒数第3个
 * ...
 */
public void reverseArray(int[] array, int start, int end) {
    // 依次交换两端位置元素的值
    if (start < end) {
        int temp = array[end];
        array[end] = array[start];
        array[start] = temp;
        reverseArray(array, start + 1, end - 1);
    }
    // 顺序交换完毕,输出数组
    System.out.println(Arrays.toString(array));
}

你可能感兴趣的:(使用递归实现字符串逆序)