我正在进行递归,我想做一个简单的事情,就像反转字符串一样。该功能正在运行,但我不明白这是怎么回事让我非常沮丧。(递归部分)
function reverseString(myString) {
if (myString == "") {
return "";
}
else {
return reverseString(myString.substr(1)) + myString.charAt(0);
}}
假设我有一个字符串“ abcd ”。所以第一个循环是:
“ myString.substr(1)”来自“ abcd ” - > “ bcd ”然后“ charAt(0)”获取“ b ”;
结果是“ bcd + b ”?或者,当递归完成时,“ myString.charAt(0)”会被执行吗?
我完全迷失了...整个过程怎么样?
答案 0 :(得分:3)
“myString.substr(1)”来自“abcd” - > “bcd”然后“charAt(0)” 得到“b”;
不,myString.substr(1)
返回值为"bcd"
的新字符串,myString
的值不会更改,因此当调用myString.charAt(0)
时,值为"a"
返回,因为它使用值"abcd"
答案 1 :(得分:1)
看看这个评估方式
return reverseString(myString.substr(1))+ myString.charAt(0);
第1步:返回 reverseString(“bcd”) + a;
第2步:返回 reverseString(“cd”) + b + a;
第3步:返回 reverseString(“d”) + c + b + a;
第4步:返回 reverseString(“”) + d + c + b + a;
答案 2 :(得分:0)
调用substr方法时不会修改Mystring。
var mystring = 'abcd';
mystring.substr(1);
console.log(mystring) // abcd
这意味着每个递归调用都会调用一个全新的字符串,第一个字符移动到字符串的末尾。
首先调用:recursiveString(bcd)+ a
第二次调用:recursiveString(cd)+ b
第三次调用:recursiveString(d)+ c
上次通话:recursiveString("")+ d
记住每个递归调用返回一个字符,然后返回一个函数来检索更多它们。每次调用返回的一个字符出现在函数之后。
因此该函数构建字符串,如:"" - > d - > c - > b - >一个
答案 3 :(得分:0)
我认为从(嵌套)调用反向串的返回的顺序查看它会更有帮助,因为它一直调用reverseString直到它传入一个空字符串 - 这就是它开始返回的东西。
call reverseString("abcd")
call reverseString("bcd")
call reverseString("cd")
call reverseString("d")
call reverseString("")
return ""
add "d" then return
add "c" then return
add "b" then return
add "a" then return
答案 4 :(得分:-2)
不,在递归调用之前会评估您传递给递归调用的所有参数。 (澄清:这仅表示myString.substr(1)
)
您是正确的,在递归调用返回后执行myString.charAt(0)
。这使得它比所谓的“尾递归”或“头递归”更复杂,其中递归调用是递归函数中的最后一个或第一个操作(分别)。编写尾递归或头递归函数可以帮助某些编译器生成更高效的代码,它还有助于使您的函数更容易理解,但它不是“必需的”。
以下是它的外观:
abcd
bcd + a
cd + ba
d + cba
dcba