使用遞歸實現字符串逆序
以下代碼可以實現字符串逆序輸出:
/** 對字符串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
遞歸執行流程總結:
方法返回的順序是與方法執行的順序倒過來的;
即最後執行的方法,最先返回,最先執行的方法,最後返回;
遞歸方法執行與返回的整個過程,類似於一個入棧和出棧的過程。
使用遞歸實現數組逆序
思路:從兩端向中間依次交換兩端位置的值,直到交換完畢。比如一個長度爲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));
}