用遞歸實現字符串反轉
題目描述:對一個字符串,如何用遞歸方式實現字符串的反轉。如字符串:“123456”,用遞歸實現反轉后,效果是“654321”。
思路:將字符串轉換成字符數組,每次截取字符串的首字符放到最后,並再次對剩余字符串遞歸截取首字符,直到滿足if條件(
originStr == null || originStr.length() <= 1)結束截取字符串操作。
遞歸實現字符串反轉 完成代碼如下:
public class Question39 { public static void main(String[] args) { System.out.println(reverse("123456")); } public static String reverse(String originStr) { if(originStr == null || originStr.length() <= 1) { return originStr; } return reverse(originStr.substring(1)) + originStr.charAt(0); } }
親測結果:
下面說一下遞歸調用的代碼解析,也就是下面這行代碼:
public static String reverse(String originStr) { if(originStr == null || originStr.length() <= 1) { return originStr; } return reverse(originStr.substring(1)) + originStr.charAt(0); }
return reverse(originStr.substring(1)) + originStr.charAt(0);這行語句中,originStr.charAt(0)是將originStr這個字符串的
第一位拿出來;
而reverse(originStr.substring(1))中的originStr.substring(1)表示把originStr這個字符串的索引為1及之后的字符(也就是originStr字符串
的第二個字符以后的子串,即"23456")拿出來。所以,執行一次遞歸后,“123456”字符串被分解為“23456”+‘1’。
由於return reverse(originStr.substring(1)) + originStr.charAt(0);這行語句中,reverse方法的存在,執行第二次遞歸,此時
originStr=“23456”,所以執行完第二次遞歸后,“23456”分解為“3456”+‘2’。
...依次類推,最后一次調用reverse方法時,也就是originStr = "6",可以看出字符串"6"滿足if(originStr == null || originStr.length() <= 1)
中的第二個條件,所以執行if條件下的語句,
也就是返回originStr,即字符串"6"。所以整個調用棧就依次返回“6”+‘5’+‘4’+‘3’+‘2’+‘1’ = “654321”。
最后,控制台輸出打印“654321”。