【问题标题】:what is actually going on when reversing a string using recursion使用递归反转字符串时实际发生了什么
【发布时间】:2016-03-17 20:16:02
【问题描述】:

我对 Javascript 比较陌生。我从概念上理解递归并看到它的价值。然而,我发现自己对实际发生的事情有点困惑。我知道这不是反转字符串的最简单方法。但我用它作为一个简单的例子

function reverse(str){
if (str === ""){ 
   return ""; 
   } else { 
       return reverse(str.substr(1)) + str.charAt(0); 
    } 
  } 

那么当代码告诉我们递归地将第一个字符放在字符串的最末尾时,像“hello”这样的字符串是如何变成“olleh”的?希望我的问题有意义。在此先感谢

【问题讨论】:

  • console.log(str.substr(1));

标签: javascript string recursion reverse


【解决方案1】:

我明白了。所以它从字符串中取出字母并以相反的顺序返回它们,直到原始字符串为空。

非常感谢!

【讨论】:

    【解决方案2】:

    致电reverse("hello")

    递归调用是

          Function Call                     Returning string
    return reverse(str.substr(1))    +        str.charAt(0);
    

    在每一步都遵循它

         Recursive Calls                              Returning strings
           reverse("ello")                                  + "h";
               reverse("llo")                          + "e"
                   reverse("lo")                  + "l"
                       reverse("o")          + "l"
                           reverse("")  + "o"
    

    不再递归返回子解决方案

                    + "h";
                + "e"
            + "l"
        + "l"
    + "o"
    -----------------------------
    "o"+"l"+"l"+"e"+"h"  =         "olleh"   ("hello" reversed)
    

    【讨论】:

      【解决方案3】:

      此函数将给定字符串的第一个字符放在“return”语句的末尾。 之后,通过删除旧字符串的第一个字符递归调用该函数并再次执行相同的操作。迭代看起来像这样:

      输入单词:'你好'

      first iteration: return reverse('ello') + 'h' // returned word until now: 'h'
      second iteration: return reverse('llo') + 'e' // returned word until now: 'eh'
      third iteration: return reverse('lo') + 'l' // returned word until now: 'leh'
      fourth iteration: return reverse('o') + 'l' // returned word until now: 'lleh'
      fifth iteration: return reverse('') + 'o' // returned word until now: 'olleh'
      sixth iteration: return '' // loop finished and returned word is 'olleh'
      

      希望对你有帮助

      【讨论】:

        【解决方案4】:

        递归函数有两种情况:基本情况和递归情况。这里,基本情况是if (str === ""){ return ""; },递归情况是return reverse(str.substr(1)) + str.charAt(0)

        考虑实际的基本情况:reverse("") 产生 ""。这很容易!

        现在让我们考虑第二个最简单的情况:reverse("c")。这导致reverse(str.substr(1)) + str.charAt(0) 变为reverse("") + "c",我们可以很容易地看到它只是"c"

        接下来,reverse("bc")。在这种情况下,表达式reverse(str.substr(1)) + str.charAt(0) 变为reverse("c") + "b"。我们从上面知道reverse("c") 就是"c"。因此,我们看到reverse("c") + "b""cb"

        最后,让我们开始理解reverse("abc")。这里,递归的情况是reverse("bc") + "a"。我们怎样才能知道reverse("bc") 是什么?我们确实做到了!依靠刚才给出的解释,我们知道reverse("bc")就是"cb",所以reverse("bc") + "a"就是"cba"

        【讨论】:

          猜你喜欢
          • 2015-08-15
          • 2014-10-02
          • 2017-07-20
          • 2017-09-27
          • 1970-01-01
          • 1970-01-01
          • 2011-07-28
          相关资源
          最近更新 更多