以下是一些Java代碼以遞歸方式反轉字符串。在Java中使用遞歸來逆轉字符串
有人可以解釋它是如何工作的嗎?
public static String reverse(String str) {
if ((null == str) || (str.length() <= 1)) {
return str;
}
return reverse(str.substring(1)) + str.charAt(0);
}
我不理解這可能如何工作。
以下是一些Java代碼以遞歸方式反轉字符串。在Java中使用遞歸來逆轉字符串
有人可以解釋它是如何工作的嗎?
public static String reverse(String str) {
if ((null == str) || (str.length() <= 1)) {
return str;
}
return reverse(str.substring(1)) + str.charAt(0);
}
我不理解這可能如何工作。
該函數將一個字符串的第一個字符 - str.charAt(0)
- 把它放在末尾,然後調用自己 - reverse()
- 上其餘的 - str.substring(1)
,加入這兩個東西放在一起,以獲取其結果 - reverse(str.substring(1)) + str.charAt(0)
當傳入的String是一個個字符以內,因此不會有剩餘部分留 - 當str.length() <= 1)
- 停止自稱遞歸和剛剛返回傳入的字符串。
所以它運行如下:
reverse("Hello")
(reverse("ello")) + "H"
((reverse("llo")) + "e") + "H"
(((reverse("lo")) + "l") + "e") + "H"
((((reverse("o")) + "l") + "l") + "e") + "H"
(((("o") + "l") + "l") + "e") + "H"
"olleH"
通過調試器運行它。一切都會變得清晰。
「迄今爲止,最好的答案」?那麼爲什麼它得到0?爲什麼人們會一直說要看它在這麼長的弦上運行?在什麼情況下它終止於「null == str」?即使是新創建的String對象也不會這樣做。畢竟空字符串對象的長度是多少? – 2013-03-14 01:58:11
你需要記住,你將不會只有一個調用 - 你將有嵌套調用。因此,當「最高度嵌套」呼叫立即返回(當它發現只是「o」)時,下一級將需要str.charAt(0)
- 其中str
在那個點是「lo」。所以這將返回「ol」。
然後下水平將收到「OL」,爲的str
其值(這是「LLO」)執行str.charAt(0)
,返回「OLL」下一級進行。
然後下水平將收到「OLL」從它的遞歸調用,對於str
其值(這是「ELLO」)執行str.charAt(0)
,返回「歐萊」下一級進行。
然後最終水平將收到「OLL」從它的遞歸調用,對於str
其值(這是「你好」)執行str.charAt(0)
,返回「2009東海生日賀」到原來的主叫方。
它可能是有意義的思考堆棧,當您去:
// Most deeply nested call first...
reverse("o") -> returns "o"
reverse("lo") -> adds 'l', returns "ol"
reverse("llo") -> adds 'l', returns "oll"
reverse("ello") -> adds 'e', returns "olle"
reverse("hello") -> adds 'h', returns "olleh"
我認爲這是正確的簡單解釋,而不是接受的,因爲遞歸調用將首先被評估,然後是「str.charAt(0)」。將最後一行分爲兩行「String ab = reverse(str.substring(1)); return ab + str.charAt(0);」 – Jayesh 2016-03-07 05:17:03
因爲這是遞歸的每一步輸出會是這樣的:
的結果:
的總收益價值會給你遞歸調用的結果加上第一個字符
到從5的返回將是: 「○」
從4所述的回報將是: 「O」 + 「L」
從3所述的回報將是: 「醇」 + 「升」
2的回報將是: 「OLL」 + 「E」
1的回報將是: 「歐萊」 + 「H」
這會給你 「2009東海生日賀」 的結果
取出字符串Hello並通過遞歸運行它。
所以第一次調用返回:
return reverse(ello) + H
二
return reverse(llo) + e
最終將返回olleH
的調用reverce(子(1))西港島線之前進行添加charAt(0)。 由於調用是嵌套的,因此在添加ex-second字符(新的第一個字符,因爲這是子字符串)之前調用子字符串的反向。
reverse(「ello」)+「H」=「 olleH「
--------^-------
reverse(」llo「)+」e「=」olle「
---------^- - ---
reverse(「lo」)+「l」=「oll」
--------^-----
reverse(「o」)+「l」=「ol 「
---------^----
「O」= 「o」 的
運行下面的代碼 - 它打印:
步驟0:ELLO/H
第1步:LLO/E
第2步:LO /升
步驟3:O /升
步驟3返回:醇
步驟2返回:OLL
步驟1返回:奧萊
步驟0返回:2009東海生日賀
代碼:
public class Test {
private static int i = 0;
public static void main(String args[]) {
reverse("Hello");
}
public static String reverse(String str) {
int localI = i++;
if ((null == str) || (str.length() <= 1)) {
return str;
}
System.out.println("Step " + localI + ": " + str.substring(1) + "/" + str.charAt(0));
String reversed = reverse(str.substring(1)) + str.charAt(0);
System.out.println("Step " + localI + " returns: " + reversed);
return reversed;
}
}
運行以下,你會看到這是怎麼回事:
public class RS {
public static String reverse(String str) {
System.out.println("--- reverse --- " + str);
if ((null == str) || (str.length() <= 1)) {
return str;
}
return add(reverse(str.substring(1)), charAt(str));
}
public static char charAt(String s) {
System.out.println("--- charAt --- " + s);
return s.charAt(0);
}
public static String add(String s, char c) {
System.out.println("--- add --- " + s + " - " + c);
return s + c;
}
public static void main(String[] args) {
System.out.println("start");
System.out.println("result: " + reverse("hello"));
System.out.println("end");
}
}
最好的解決方案我發現了什麼。
public class Manager
{
public static void main(String[] args)
{
System.out.println("Sameer after reverse : "
+ Manager.reverse("Sameer"));
System.out.println("Single Character a after reverse : "
+ Manager.reverse("a"));
System.out.println("Null Value after reverse : "
+ Manager.reverse(null));
System.out.println("Rahul after reverse : "
+ Manager.reverse("Rahul"));
}
public static String reverse(String args)
{
if(args == null || args.length() < 1
|| args.length() == 1)
{
return args;
}
else
{
return "" +
args.charAt(args.length()-1) +
reverse(args.substring(0, args.length()-1));
}
}
}
輸出:C:\用戶\管理員\桌面>的java管理器 薩米爾反向後:反向後 空值::空 的Rahul反向後:反向後reemaS 單個字符luhaR
public class ReverseString{
private static String reverse(String text, String reverseStr){
if(text == null || text.length() == 0){
return reverseStr;
}
return reverse(text.substring(1), text.charAt(0)+reverseStr);
}
public static void main(String [] args){
System.out.println(reverse("hello", "")); //output is "olleh"
}
}
用於在Java中反轉字符串的另一種解決方案。
使用.toCharArray()函數將字符串轉換爲char數組。
public static char[] reverse(char in[], int inLength, char out[],
int tractOut) {
if (inLength >= 0) {
out[tractOut] = in[inLength];
reverse(in, inLength - 1, out, tractOut + 1);
}
return null;
}
import java.util.Scanner;
public class recursion{
public static void main (String []args){
Scanner scan = new Scanner(System.in);
System.out.print("Input: ");
String input = scan.nextLine();
System.out.print("Reversed: ");
System.out.println(reverseStringVariable(input));
}public static String reverseStringVariable(String s) {
String reverseStringVariable = "";
for (int i = s.length() - 1; i != -1; i--) {
reverseStringVariable += s.charAt(i);
}
return reverseStringVariable;
}
}
class Test {
public static void main (String[] args){
String input = "hello";
System.out.println(reverse(input));
}
private static String reverse(String input) {
if(input.equals("") || input == null) {
return "";
}
return input.substring(input.length()-1) + reverse(input.substring(0, input.length()-1));
} }
下面是一個示例代碼段,這可能會幫助你。爲我工作。
import java.util.*;
public class StringReverser
{
static Scanner keyboard = new Scanner(System.in);
public static String getReverser(String in, int i)
{
if (i < 0)
return "";
else
return in.charAt(i) + getReverser(in, i-1);
}
public static void main (String[] args)
{
int index = 0;
System.out.println("Enter a String");
String input = keyboard.nextLine();
System.out.println(getReverser(input, input.length()-1));
}
}
在線樣本;
public static String strrev(String str) {
return !str.equals("") ? strrev(str.substring(1)) + str.charAt(0) : str;
}
使用遞歸來反轉字符串是一個壞程序員的明確標誌。 – DwB 2012-03-15 16:34:38
這是作業,@DwB - 我認爲這是遞歸的合理示範。 – adelphus 2012-03-15 16:37:31
@DwB它有一個作業標籤,所以他們可能使用它來教授遞歸。它是理解遞歸如何工作的最簡單方法之一 – jzworkman 2012-03-15 16:38:24