javascript - 有人可以解释 return 语句如何与 javascript 中的递归一起使用吗?

标签 javascript recursion

我已经查看过论坛,我看到一些标题相似但没有一个能回答我的问题。我注意到如果我创建一个递归函数,返回语句会在它看起来像终止语句之后返回。有人可以向我解释这如何工作吗?谢谢

function recur(n=10){
  if(n===0){
    return "";
  }
  console.log(n);
  return "A" + recur(n-1);
}

recur()

最终结果是:

10
9
8
7
6
5
4
3
2
1
"AAAAAAAAAA"

我希望它为函数的每个实例返回 A,因为我认为函数定义中的每个语句都会为函数的每个实例调用,如下所示:

10
"A"
9
"A"
8
"A"
7
"A"
6
"A"
5
"A"
4
"A"
3
"A"
2
"A"
1
"A"

所以重申一下为什么函数没有像我预期的那样返回 A,我误解了函数的运行方式是什么?

最佳答案

这样计算可能有助于您理解:

recur(5) = "A" + recur(4)
         = "A" + ("A" + recur(3))
         = "A" + ("A" + ("A" + recur(2)))
         = "A" + ("A" + ("A" + ("A" + recur(1))))
         = "A" + ("A" + ("A" + ("A" + ("A" + recur(0)))))
         = "A" + ("A" + ("A" + ("A" + ("A" + ""))))
         = "A" + ("A" + ("A" + ("A" + ("A"))))
         = "A" + ("A" + ("A" + ("AA")))
         = "A" + ("A" + ("AAA"))
         = "A" + ("AAAA")
         = "AAAAA"

因此 recur(5) 返回 "AAAAA"。您应该能够扩展此推理以证明 recur(10) 返回 "AAAAAAAAAA"

您每次打印 n 的值,一个整数,打印 each 递归调用的结果>重复出现。您在最后看到的 "AAAAAAAAAA" 是控制台(shell、REPL、...)显示您执行的所有结果的结果;在这种情况下,您会在 recur() 调用结束时看到它,这与 recur(10) 相同。

如果你想“追踪”这个函数,你可以把结果赋值给一个变量,然后返回它。试试这个:

$ node
> function recur(n=10){
...   if(n===0){
.....     return "";
.....   }
...   let result = "A" + recur(n-1);
...   console.log(n, result);
...   return result;
... }
undefined
> recur()
1 'A'
2 'AA'
3 'AAA'
4 'AAAA'
5 'AAAAA'
6 'AAAAAA'
7 'AAAAAAA'
8 'AAAAAAAA'
9 'AAAAAAAAA'
10 'AAAAAAAAAA'

关于javascript - 有人可以解释 return 语句如何与 javascript 中的递归一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41785908/

相关文章:

javascript - 支持 DST 和服务器同步的世界时钟

javascript - 如何使用委托(delegate)事件?

javascript - 使用正则表达式从 url 匹配 id

java - Java递归查找链表中的 'maximum'字符

python - 递归{pattern} 替换/使用对象的属性

java - 将 block 分成象限

c++ - 尝试使用 C++ 实现检测字符串中回文的递归版本。在这里遇到一些麻烦

javascript - 为什么 IE 和 Firefox 对 div 返回不同的溢出尺寸?

javascript - 在 React Native 应用程序开发中从 ModelDropdown 获取文本

file - 从子路径中递归删除特定文件的脚本?