尾递归一个实验

我刚在.Net下做了测试,对于尾递归,在Debug模式下,不会被优化为非递归结构,在Release模式下,会被优化为非递归结构,就不存在栈溢出的问题了

STST?

这是我模拟的文件结构类

STST

?

这是非尾递归版本

STST

这是尾递归版本

STST

这是测试代码

STST

这是CreateDir的定义

STST

结果:

1,在Debug模式下,无论是不适尾递归,都会溢出

2,在Release模式下,非尾递归版本会溢出,而尾递归版本不会溢出

STST

现代编译器我认为都会有的

STST

因为尾递归优化为非递归版本已经是很古老的技术了

STST

你可以在Java下测试下,我没有Java的环境

STST

只需要把你的方法参数改为File数组类型,就可以把递归变成真正的尾递归了

STST


这个没有依据的

0XB000:Do_尾递归(Files)

……

……

栈:

0XA000:->参数:Files

0XA004:->返回地址:0XA000

0XA008:? ->参数:Files

0XA012:? ->返回地址:0XA004

0XA016:??? ->参数:Files

0XA020:??? ->返回地址:0XA012

…………

以上是递归的栈结构,尾递归具有这样一个事实:

就是每一次递归时,其之前的调用已经计算完毕,无需存储中间结果,所以本次调用完全可以使用前一次调用的栈,所以栈结构并不会向下延伸

时间: 2024-12-24 10:44:44

尾递归一个实验的相关文章

【基础】一个实验搞定华为Hybrid-vlan的原理和配置

1.实验拓扑: 使用ENSP模拟器(版本V100R002C001.2.00.150) 2.   实验需求: 1)PC1和PC3属于VLAN10 2)PC2和PC4属于VLAN20 3)PC5和PC6属于VLAN30 4)VLAN10和20的成员都可以和VLAN30中 PC5通信,但是VLAN10和VLAN20的成 员之间不能通信(通过二层技术实现此需求,就是华为Hybrid-vlan技术的灵活之处) 3.  实验步骤: 1)  IP规划://这里均配置为192.168.1.0网段 PC1:192

一个实验轻松学习,华为单臂路由、DHCP、LACP模式链路捆绑、二层与三次链路混绑

实验拓扑 实验需求 1.C1与C3属于vlan10,C2与C4属于vlan20 2.SW1与SW2之间使用LACP模式链路捆绑,活动接口为2个 3.SW1与R1之间进行链路混绑 4.VLAN 10 与 VLAN 20 通过DHCP自动获取IP地址 5.在R1上配置单臂路由使全网互通 vlan10 IP:192.168.10.0/24 vlan20 IP:192.168.20.0/24 SW1配置: <SW1>system-view                //进入系统视图 [SW1]vl

一个实验搞定华为hybrid-vlan基本配置及原理

实验拓扑: 2.   实验需求:PC1和PC3属于VLAN10  PC2和PC4属于VLAN20  PC5和PC6属于VLAN30.VLAN10和20的成员都可以和VLAN30中PC5通信,但是VLAN10和VLAN20的成员之间不能通信(通过二层技术实现此需求,就是华为Hybrid-vlan技术的灵活之处) 3.  实验步骤:1)  IP规划://这里均配置为192.168.1.0网段PC1:192.168.1.10,PC2:192.168.1.20,PC3:192.168.1.30,PC4:

在ASP.NET下做了一个实验MVC的小东西

星期五下班前一时兴起,对MVC发表了一点看法.后来就想干脆弄个小东西来验证一些自己的想法帮组理清思路.所要源代码的免了,3个小时的急就章实在是乱得可以,既没有好的架构,也没有任何代码质量可言,主要是实现了对MVC的一点想法.所以拿出来大家给参考一下.申明:不是典型的MVC 在这里我参考了Web.Py的一些做法,首先我们将Url当作一种资源,一个典型的Url,如下: http://www.x.com/Index/view/2007/10/21 我们将从/Index/Topic/2007/10/21

关于Windows更新窗口内容的问题(作为一个实验,效果很明显)

Windows中的窗口在特定情况下会由系统进行重绘,如无效区域重新显现时,,会向窗口的处理过程发送VM_PAINT消息,但是,可能还有Windows自己的更新窗口处理,如在下面的代码中,将击键显式地转换为VM_PAINT消息,让窗口过程处理,但是运行的结果却是,击键后窗口没有马上重绘(显示字体没有改变),而是在下次重绘时才改变字体,但是如果改变为一个UpdateWindow()函数时,就会马上改变字体.猜想UpdateWindow(),InvaliddateRect()和Windows系统调用都

java一个实验

第一步: applicationContext-main.xml下,删除代码 <!-- 货物类型  -->    <bean id="cargoTypeDao" class="wazert.cargo.services.impl.CargoTypeDaoImpl">        <property name="dataSource">            <ref bean="dataSou

关于wtl的一个实验

代码如下: #include <iostream> using namespace std; template<typename T> class Base { public: void SayHi() { T* pT = static_cast<T*>(this); pT->PrintClassName(); } protected: void PrintClassName() { cout << "This is class Base.\

【中英对照】【EntLib6】【Unity】实验1:使用一个Unity容器

Lab 1: Using a Unity Container 实验1:使用一个Unity容器 Estimated time to complete this lab: 15 minutes 估计完成时间:15分钟 Introduction 介绍 In this lab, you will practice using a Unity container to create application objects and wire them together. You will update a

48_类加载器的一个高级问题的实验分析

  这是一个实验,源代码 链接:http://pan.baidu.com/s/1c0ix9UK 密码:ssvd 1.让tomcat加载MyServlet http://localhost:8080/itcastweb/servlet/MyServlet   2.让jvm加载MyServlet 导出MyServlet.class到 D:\Program Files\Java\jdk1.8.0\jre\lib\ext\itcast_web.jar, 则java虚拟机的ExtClassLoader加载