当前位置:首页 > 日记 > 正文

尾递归使用的详细说明

尾递归使用的详细说明
最近几天,我看到了几篇关于尾递归的文章,以前没有关于尾递归的大概念,所以我回顾了尾递归。
尾递归概念
尾递归的概念(尾递归)是递归的一个子概念。普通递归的调用堆栈的使用是不可估量的因为需要记住的递归调用堆栈。例如,在下面的PHP部分的第一个例子使用PHP写的一个阶乘函数,这是由于对由于递归栈溢出错误,尾递归的目的是消除递归栈的缺点。
从代码级别来说,尾递归实际上使它变得清晰:

函数的最后一个操作是递归调用。
例如,feibona递归实现PHP楔形阵:
复制代码代码如下所示:
fibonacci.php
< PHP
函数斐波那契(n){
如果($<2){
返回n;
}
回报斐波纳契(N - 1)+斐波那契(N - 2);
}
var_dump(斐波那契(30));

这是一个递归函数,但不是尾递归,因为斐波那契的最后一个运算是加法运算。

转尾递归:
复制代码代码如下所示:
功能fibonacci2(美元美元美元,ACC,ACC){
如果($ = 0){
返回的ACC1;
}
返回fibonacci2($ n-1,ACC2美元美元美元,ACC1 + ACC2);
}

fibonacci2是尾递归,这增加了两个累加器,ACC1和ACC2,给出初始值。记住:递归尾递归要增加蓄电池和减少递归操作的思路。
尾递归在不同语言中的应用也是不同的,函数编程Erlang最常用的是几乎所有递归函数都被转换成尾部递归,下面是几个不同语言中尾递归的性能和应用的几个例子。

PHP中的尾部递归
我们做一个实验

常见的递归:
复制代码代码如下所示:
< PHP
函数阶乘(n)
{
如果($ = 0){
返回1;
}
返回阶乘(n-1)* n;
}

var_dump(阶乘(100000000));

尾递归:
复制代码代码如下所示:
< PHP
函数阶乘($ n,ACC)
{
如果($ = 0){
返回$;
}
返回阶乘($ n-1);
}
var_dump(阶乘(100000000, 1));

实验结果:
事实证明
PHP中的尾部递归没有任何优化效果!

c中的尾递归

在C语言中进行尾递归优化,在GCC编译时加入O2,对尾递归进行优化。
我们可以直接查看生成的汇编代码:

(使用gdb,gcc -O2阶乘。C O因子;解体因子)
不是由O2生成的汇编程序:
O2优化汇编:
没有大头,我也是第一个看汇编的,但是这个代码很简单,可以在线搜索一点命令,大致理解:
复制代码代码如下所示:
功能因素(N,总和){
而(n)!= 0){
总和=n和
n = n
}
收起回复

}

GCC做的是智能优化。
如果您感兴趣的话,您可以使用O3优化尾部递归,并查看其中的汇编指令。

臭氧的优化是直接扩展循环。
总结

一般的线性递归修改尾递归的最大优势是减少递归调用堆栈的开销。从PHP实例,递归的开销对方案的影响显而易见。但并不是所有的语言都支持尾递归,甚至支持尾递归语言一般是在编译时优化尾递归优化如尾递归C语言。当尾递归是用来优化代码,你必须首先了解尾递归语言的支持。

相关文章

winservs.exe的过程是怎样的

winservs.exe的过程是怎样的

的是,过程,是怎样,电脑软件,winservs,评论:对winservs.exe工艺简介 进程文件:winservs或winservs.exe 进程名称:winservs 过程类别:安全风险的过程 英文描述: winservs.exe是软件声称可以扫描您的硬盘驱动器执行成人内容。它被分为广告软件在…

一种linux下对发射器的固定方法

一种linux下对发射器的固定方法

方法,发射器,电脑软件,linux,点评:linux下的一些绿色软件,没有安装可以双击启动,但有些程序直接在启动器锁中打开,选择按钮会用到一些默认的图标,通常如果符合大众审美的趋势的话,不应该认为它很漂亮。 Linux的一些绿色软件,无需安装可以双击启动,…

如何用excel作为条形码自动更新条

如何用excel作为条形码自动更新条

条码,解决方案,自动更新,条形码,如何用,问题: 领导者用excel制作产品条形码,当产品号被修改时,条码可以自动更新。如何解决这个问题 答案uff1a 是的,首先,请参阅下面的方法,在Excel中选择条形码控件,然后在设置数据源时将条形码与商品编号联系起…

在Linux使用SED命令替换字符串小结

在Linux使用SED命令替换字符串小结

替换字符串,命令,电脑软件,Linux,SED,注释:本文主要介绍了在Linux中使用SED命令替换Notes字符串。这纯粹是个人总结,需要的朋友可以参考一下。 最近,一些小脚本已被写入到SED命令,并已学会,顺便说一下。 SED替换的基本语法是: 将代码复制如下:原…

Copyfilepromptsinwin7foldernamei

Copyfilepromptsinwin7foldernamei

电脑软件,Copyfilepromptsinwin7foldernameistoolongreason,问题: 在单位,同事将文件复制到我的电脑,系统总是提示该文件夹的名称太长我的电脑复制文件到自己的电脑很好。我们俩的电脑也买了同样的品牌,同样的模式,和相同的系统,所有存在的原因…

打开或关闭Win7的防火墙的方法(方案

打开或关闭Win7的防火墙的方法(方案

防火墙,方案,方法,电脑软件,windows7系统(简称Win7)打开或关闭防火方法: 首先,打开在系统中;控制面板,然后点击系统与安全打开新窗口,你可以看到Windows Firewall (如下图所示)。点击打开Windows防火墙接口。 你可以看到在新窗口的左侧;打开或关闭…

PHPCodeIgniter的学习笔记

PHPCodeIgniter的学习笔记

学习笔记,电脑软件,PHPCodeIgniter,在使用数据库,我们最好将数据库自动:自动加载配置 / autoload.php $autoload { 'libraries} =阵列('database); 一些常见的功能 选择数据 $ > > db - >选择(); 允许您在SQL查询中写入select的一部分。 在这里(>…

如何隐藏Word2003的最近使用的文档

如何隐藏Word2003的最近使用的文档

文档,最近使用,电脑软件,作为一个上班族,公司秘密的保护是最重要的。有时为了防止病毒和黑客的入侵,公司机密被盗。有时它是为了防止一些人,窥视秘密,等等,我们可以采取很多保护Word文档的内容被泄露的措施。 打开word文件按钮,您会发现您最近使…

该winde.exe-焊接过程是什么意思

该winde.exe-焊接过程是什么意思

过程,电脑软件,winde,exe,评论:winde.exe -焊接工艺 进程文件:上海或winde.exe 进程名称:dluca病毒 过程类别:安全风险的过程 英文描述: winde.exe添加到系统,作为一个结果的dluca病毒。它从您的计算机计算机发送详细信息到指定的在线位置。这…

Word2003画箭头,双箭头、斜线箭头的

Word2003画箭头,双箭头、斜线箭头的

箭头,双箭,电脑软件,虽然词不是绘图软件,和制图的工具不是很强,但当我们把文件的定期,我们可以用它画一些简单的图形,如正方形,画圆,画直线,画箭头等等。这个时间向你解释,如何使用Word2003绘制各种箭头。 Word2003绘制直线和斜线箭头 这是最简单的…

打开浏览器0x00000050igdpmd64.sys

打开浏览器0x00000050igdpmd64.sys

蓝屏,溶液,打开浏览器,电脑软件,sys,当你使用笔记本更新系统文件或点击,打开IE浏览器,电脑出现蓝屏,蓝屏代码和0x00000050和igdpmd64.sys等信息。(如下图),这个问题可能是安装系统补丁相关kb2670838。 请参考以下四种方法来解决,最后一种方法只适…

msniasvc.exe的功能是什么该msnias

msniasvc.exe的功能是什么该msnias

查询,功能,过程,电脑软件,msniasvc,点评:MSNIASVC.EXE是MSN 9产品配置的相关程序 进程文件:msniasvc或msniasvc.exe 过程名称:微软信使服务 过程类别:安全风险的过程 英文描述: msniasvc.exe是一个过程的旁边安装了MSN 9版本是负责任的,是的,它…