云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

腾讯云_如何做数据库_学生机

小七 141 0

腾讯云_如何做数据库_学生机

在开始研究尾部递归之前,微信淘客,让我们先看看普通的递归。

一个简单的递归阶乘实现:

让N=5,看看如何为每次递归调用创建新的堆栈帧:

我们现在有两个堆栈帧,其中一个存储N=5时的上下文,最上面的一个用于当前计算:n=4

现在由于n=1,我们停止递归。弹出当前堆栈帧(n=1),激活当前堆栈帧下的帧,成为最顶层的帧,将计算结果1传给

正常递归的注意事项:在递归过程中,51返利,每一个生成的堆栈帧都是需要的,电梯物联网,直到最后的结果被计算出来后才能被销毁。直到递归到达终点(条件n===1满足),计算才开始。如果N是一个大整数,大数据的发展,将导致大量的堆栈帧,最后"堆栈溢出"或"内存不足"是不可避免的。本文介绍了一种新的内部函数&tailFactorial。现在,计算实际上分布在每个递归堆栈帧中。每一帧完成一部分计算并将当前结果传递给下一帧。一旦当前堆栈帧完成其任务,实际上就不再需要它了。例如模型浏览器可以对那些无用的堆栈帧进行优化

观察堆栈帧的尾部递归情况:

堆栈弹出:

当N=20时,尾部递归的性能远远好于普通递归:

尾部递归通过Scala实现:

有趣的是,好评返现卡,Scala代码编译成Java字节码后,编译器会自动消除递归:

首先这是普通递归:

下面是尾部递归版本: