【问题标题】:Where are the results of recursion stored in javascript?javascript中递归的结果存储在哪里?
【发布时间】:2018-04-25 04:51:29
【问题描述】:

当我调用递归函数时,调用的结果会去哪里?

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

reverse("String"); 
console.log(rev); // ----> "undefinedS" - Only the last call is saved.

如果我只是返回值,它似乎很好。结果存储在哪里?

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

reverse("String") // ----> "gnirtS"

【问题讨论】:

  • 它不会被存储在任何地方,如果您在函数中没有return,它将一直运行到完成并且返回值将是未定义的
  • 这里有一个提示:不返回任何内容,对reverse 的调用将返回undefined。所以你得到undefinedS,因为你连接undefined(reverse(str.substr(1))的结果)和S(str.charAt(0)的结果)。
  • 不是未定义的……是未定义的第一个操作结果。
  • 函数返回的内容和你分配给全局变量rev的内容是有区别的。
  • 您的函数没有返回任何内容,因此在您第二次调用时,它将返回undefined,这就是您得到undefinedS的原因

标签: javascript recursion


【解决方案1】:

您的第一个版本

rev 存储在全局命名空间中,每次调用函数reverse 时都会被覆盖。

当字符串的长度为 1 时,递归停止,只取了最后 n-1 个字符。结果,最后一个字符是字符串中唯一的字符S,这就是str.charAt(0) 给出的。

由于函数reverse 在str 的长度为0 时不返回值("S".substr(1) 会发生这种情况),所以reverse(str.substr(1)) 的值是undefined。

这导致undefinedS。

你的第二个版本

这个版本创建了一个调用堆栈,其中字符串慢慢地被 n-1 (其中 n 是它的长度)分开,直到它的长度为 1。此时堆栈被展开,导致每个字母从最后一个到第一个被退回。每个函数调用都作为自己的执行上下文,变量环境保存每个字符串的值。

调用栈展开的结果是gnirtS。

【讨论】:

    【解决方案2】:

    Cleaner Look 代码

    function reverse(str){ 
       return (str.length == 1)? str : reverse(str.substr(1)) + str.charAt(0);
    }
    

    【讨论】:

    • 或者通过箭头函数:) var reverse = str => (str.length == 1)? str : reverse(str.substr(1)) + str.charAt(0);
    猜你喜欢
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2021-11-16
    • 2020-07-31
    • 2014-04-08
    • 1970-01-01
    • 2018-09-08
    相关资源
    最近更新 更多