用递归反转字符串

时间:2016-07-23 03:03:57

标签: javascript recursion

我正在进行递归,我想做一个简单的事情,就像反转字符串一样。该功能正在运行,但我不明白这是怎么回事让我非常沮丧。(递归部分)

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)”会被执行吗?

我完全迷失了...整个过程怎么样?

5 个答案:

答案 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