有人可以解释一下使用尾递归的反向字符串算法吗?
Could someone please explain the algorithm of reverse string using tail recursion?
抱歉问这个问题太蠢了。在获取给定字符串的最后一个字符和 return 之前,我能够理解代码,然后我无法关联递归逻辑。
在此处发布之前,调试器部分帮助了我。不幸的是,不是 100%
你能帮我理解一下吗?
public static void main(String[] args) {
System.out.println(reverseRecursively("abcd"));
}
public static String reverseRecursively(String str) {
if (str.length() < 2) {
return str;
}
return reverseRecursively(str.substring(1)) + str.charAt(0);
}
调试器输出:
0=abcd
1=bcd
2=cd
3=d
Final: dcba
好吧,这是一个非常简单的逻辑:
return reverseRecursively(str.substring(1)) + str.charAt(0);
如果将 System.out.println() 放在 return 之前,您将获得以下输出:
Recursing with substring: bcd and adding a
Recursing with substring: cd and adding b
Recursing with substring: d and adding c
Adding d as final char
如果你反转这个,你会得到 dcba
。
为什么会反过来呢?
嗯,你要想到调用trace:
return reverseRecursively("bcd") + a -> retruns "dcba"
-> return reverseRecursively("cd") + b -> returns "dcb"
-> return reverseRecursively("d") + c -> returns "dc"
-> return d -> returns "d"
我想关键是要理解递归总是与另一个递归的结果相结合。
当方法 运行s 时,它将首先检查 String 的长度是一个字符还是零个字符。这将告诉它它是否是字符串中的最后一个字符。如果不是,它会将当前字符追加到字符串的末尾并再次 运行 ,这次是在下一个字符上。这意味着字符串每次都会缩短一个字符。
可能令人困惑的是 str.charAt(0)
没有传递到方法的下一次迭代中,而只是作为 return 语句的一部分添加。这意味着一旦该方法完成了最后一个字符,它将 return 所有字符以倒序排列,因为每个方法从 return 最后一个字符开始一个接一个地完成。这将发生,直到所有方法 return 和 return 都是你的反转字符串。
这就像一层层的方法,一个调用另一个,然后它们都将按照调用它们的顺序倒序完成。
希望这对您的理解有所帮助!
没有问题是愚蠢的问题。如果一个人不问一个问题,认为人们会认为 he/she 是愚蠢的,那么 he/she 就是一生的愚蠢。 :)
现在解释:
我添加了打印语句来帮助您。
public static String reverseRecursively(String str) {
System.out.println("For debuging : "+str); // this is my print statement.
if (str.length() < 2) {
return str;
}
return reverseRecursively(str.substring(1)) + str.charAt(0);
}
打印如下。
For debuging : abcd
For debuging : bcd
For debuging : cd
For debuging : d
dcba
return 值的方法的基本标准是,str.length() < 2
。
所以当"d"被最后一个方法调用return编辑时(或者我们可以说第四次方法调用reverseRecursively(String str)
),因为长度小于2。第三个方法调用将 return
"d" + "cd".charAt(0);
这不过是 : dc.
类似的第二种方法将使用第三种方法的 return 值 (dc) 和 return 值
"dc" + "bcd".charAt(0);
这是dcb。
所以第一个方法调用,您将字符串 "abcd" 作为输入传递给 return.
"dcb" + "abcd".charAt(0);
这是dcba。
希望这对您有所帮助。干杯!!!
`public static String reverseRecursively(String str) {
if (str.length() < 2) {
return str;
}
return reverseRecursively(str.substring(1)) //take "bcd" : 1st Itration
//"cd" : 2nd
// "d" : 3rd (this makes str.length() < 2)
// 3rd returns first with "d" and pass control back to 2nd recursion
//2nd takes d and adds 0th char c and returns with "dc" and pass control to 1st
//1st takes dc and adds b returns with "dcb" and pass control to base call
// base call take "dcb" and adds 0th char a and returns to calling method
+ str.charAt(0);
}`.
抱歉问这个问题太蠢了。在获取给定字符串的最后一个字符和 return 之前,我能够理解代码,然后我无法关联递归逻辑。
在此处发布之前,调试器部分帮助了我。不幸的是,不是 100%
你能帮我理解一下吗?
public static void main(String[] args) {
System.out.println(reverseRecursively("abcd"));
}
public static String reverseRecursively(String str) {
if (str.length() < 2) {
return str;
}
return reverseRecursively(str.substring(1)) + str.charAt(0);
}
调试器输出:
0=abcd
1=bcd
2=cd
3=d
Final: dcba
好吧,这是一个非常简单的逻辑:
return reverseRecursively(str.substring(1)) + str.charAt(0);
如果将 System.out.println() 放在 return 之前,您将获得以下输出:
Recursing with substring: bcd and adding a
Recursing with substring: cd and adding b
Recursing with substring: d and adding c
Adding d as final char
如果你反转这个,你会得到 dcba
。
为什么会反过来呢?
嗯,你要想到调用trace:
return reverseRecursively("bcd") + a -> retruns "dcba"
-> return reverseRecursively("cd") + b -> returns "dcb"
-> return reverseRecursively("d") + c -> returns "dc"
-> return d -> returns "d"
我想关键是要理解递归总是与另一个递归的结果相结合。
当方法 运行s 时,它将首先检查 String 的长度是一个字符还是零个字符。这将告诉它它是否是字符串中的最后一个字符。如果不是,它会将当前字符追加到字符串的末尾并再次 运行 ,这次是在下一个字符上。这意味着字符串每次都会缩短一个字符。
可能令人困惑的是 str.charAt(0)
没有传递到方法的下一次迭代中,而只是作为 return 语句的一部分添加。这意味着一旦该方法完成了最后一个字符,它将 return 所有字符以倒序排列,因为每个方法从 return 最后一个字符开始一个接一个地完成。这将发生,直到所有方法 return 和 return 都是你的反转字符串。
这就像一层层的方法,一个调用另一个,然后它们都将按照调用它们的顺序倒序完成。
希望这对您的理解有所帮助!
没有问题是愚蠢的问题。如果一个人不问一个问题,认为人们会认为 he/she 是愚蠢的,那么 he/she 就是一生的愚蠢。 :)
现在解释:
我添加了打印语句来帮助您。
public static String reverseRecursively(String str) {
System.out.println("For debuging : "+str); // this is my print statement.
if (str.length() < 2) {
return str;
}
return reverseRecursively(str.substring(1)) + str.charAt(0);
}
打印如下。
For debuging : abcd
For debuging : bcd
For debuging : cd
For debuging : d
dcba
return 值的方法的基本标准是,str.length() < 2
。
所以当"d"被最后一个方法调用return编辑时(或者我们可以说第四次方法调用reverseRecursively(String str)
),因为长度小于2。第三个方法调用将 return
"d" + "cd".charAt(0);
这不过是 : dc.
类似的第二种方法将使用第三种方法的 return 值 (dc) 和 return 值
"dc" + "bcd".charAt(0);
这是dcb。
所以第一个方法调用,您将字符串 "abcd" 作为输入传递给 return.
"dcb" + "abcd".charAt(0);
这是dcba。
希望这对您有所帮助。干杯!!!
`public static String reverseRecursively(String str) {
if (str.length() < 2) {
return str;
}
return reverseRecursively(str.substring(1)) //take "bcd" : 1st Itration
//"cd" : 2nd
// "d" : 3rd (this makes str.length() < 2)
// 3rd returns first with "d" and pass control back to 2nd recursion
//2nd takes d and adds 0th char c and returns with "dc" and pass control to 1st
//1st takes dc and adds b returns with "dcb" and pass control to base call
// base call take "dcb" and adds 0th char a and returns to calling method
+ str.charAt(0);
}`.