加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 尾递归与头经典递归

发布时间:2020-12-16 09:18:33 所属栏目:安全 来源:网络整理
导读:听 Scala课程和我经常听到的解释:“但在实际代码中,我们不使用递归,而是使用递归递归”. 这是否意味着在我的Real代码中,我不应该使用递归,而是尾循环,这非常像循环,并且不需要这个史诗短语“为了理解递归,你首先需要理解递归”. 在现实中,考虑到你的堆栈..
听 Scala课程和我经常听到的解释:“但在实际代码中,我们不使用递归,而是使用递归递归”.

这是否意味着在我的Real代码中,我不应该使用递归,而是尾循环,这非常像循环,并且不需要这个史诗短语“为了理解递归,你首先需要理解递归”.

在现实中,考虑到你的堆栈..你更有可能使用循环的尾部递归.

我错了吗?这个“经典”的递归是否只适用于教育目的,让你的大脑回到大学 – 过去?

或者,对于所有这些,我们可以使用它的地方..递归深度小于X(其中X是堆栈溢出限制).或者我们可以从经典递归开始编码,然后,怕堆栈吹一天,应用几个重构,使其尾随,以便在重构领域更加强大使用?

问题:一些真实的样本,您将使用/已经使用“经典头”递归在您的真实代码,这不是重构到尾部,也许?

解决方法

尾循环==循环

您可以采取任何循环,并将其表示为尾递归调用.

背景:在纯FP中,一切都必须产生一定的价值.而scala中的循环不会导致任何表达式,只有副作用(例如更新某些变量).它只存在于支持来自强制性背景的程序员. Scala鼓励开发人员重新考虑使用递归替换while循环,这总是导致一些值.

所以根据Scala:递归是新的迭代.

但是,以前的语句存在一个问题:“常规”递归代码更容易阅读,但会带来性能损失,并具有溢出堆栈的固有风险.另一方面,尾递归代码不会导致堆栈溢出(至少在Scala *中),性能将与循环相同(实际上,我确信Scala将所有尾递归调用转换为简单的旧迭代).

回到这个问题,坚持“定期”递归没有错,除非:

>您在计算大量数据时使用的算法(堆栈溢出)>尾巴递减带来明显的业绩增长

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读