【问题标题】:Javascript recursion with return statement and without带有 return 语句和没有的 Javascript 递归
【发布时间】:2020-04-14 09:28:51
【问题描述】:

这两个递归函数有区别吗?一个带有 return 语句,一个没有它用于递归调用。他们都在控制台浏览器中打印数字 1 - 8,我的问题是当递归发生时是否有一些优化发生在返回与没有返回时。

const solution = (input, i = 0) => {
  if (i === input) return // base case
  console.log(i)
  return solution(input, i + 1) // return recursive call
}

const solution2 = (input, i = 0) => {
  if (i === input) return // base case
  console.log(i)
  solution2(input, i + 1) // recursive call
}

console.log(solution(4))
console.log("----")
console.log(solution2(4))

【问题讨论】:

  • 你为什么不自己运行它们,看看有什么不同
  • 我相信每个函数都有一个隐式返回,所以这样说没有区别

标签: javascript recursion indexing numbers return


【解决方案1】:

如果最终的递归调用没有返回任何内容(如您问题中的示例),则没有区别。

如果最终的递归调用确实返回了一些东西,并且你希望它渗透到solution 的初始调用者,那么你确实需要返回递归调用:

const solution = (input, i = 0) => {
  if (i === input) return 'returnVal' // base case
  return solution(input, i + 1) // return recursive call
}

const solution2 = (input, i = 0) => {
  if (i === input) return 'returnVal' // base case
  solution2(input, i + 1) // recursive call
}

console.log(solution(9))
console.log("----")
console.log(solution2(9))

ES6 does specify 的递归函数,其最终操作是对 return 的调用本身应该会导致递归调用而不增加调用堆栈。如果实现,这将意味着,例如,在解析之前递归调用自身 100,000 次的函数可以成功运行,而不会溢出堆栈。 (如果没有尾调用优化,这种情况会导致堆栈溢出。)

但是,不幸的是,正如您从上面的链接中看到的那样,尽管它是规范的一部分,但并未得到广泛实施,因此您希望的优化在大多数环境中实际上并不存在。

【讨论】:

  • 未广泛实施 - 即只有 Safari 和 IOS 浏览器(移动)以及几个不起眼的服务器运行时实施了它
  • @JaromandaX Jup。即使在 6 年后,也没有 ES6 / ES2015 的完整实现,只有几个接近。这也意味着 ES2016-ES2019 也没有实现,因为它们都依赖于 ES2015。
猜你喜欢
  • 1970-01-01
  • 2017-12-20
  • 2019-01-25
  • 2020-12-28
  • 2020-01-04
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多