聊聊“尾递归优化“简介拷贝构造&拷贝赋值

本文介绍了尾递归优化的方法及其应用实例,并探讨了如何通过for循环避免栈溢出问题。此外,还深入讲解了C++中的拷贝构造与赋值构造,包括其应用场景及实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

尾递归优化

尾递归.顾名思义,将本函数的工作结果作为参数,调用本函数,然后将其结果返回.
尾递归可以被优化.原因在于:在尾递归中我们不需要保存上一次本函数调用的结果.因为我们已经在尾部了:)

怎么优化呢?

用for循环即可:

//尾递归
Recursion(int a)
{
    if(退出条件)
    {
    return X
    }
    具体操作;
Recursion(a);

}
//用for优化后:

for(;**!退出条件**;)
{
    具体操作;
}

轻松解决爆栈有木有?

聊一件与尾递归相关的事情,
当年写win32调试器的时候,码过一段自认为爽的代码,它顺畅地打印出了当前程序的栈回溯

//栈回溯递归搜寻
void kRecur(DWORD* dwEbp)
{
    if(nullptr==dwEbp)
    {return;}

    DWORD dwNewEbp=0;

    if( false==ReadDebuggedMemory((PVOID)dwEbp,4,_Out_ (BYTE*)(&dwNewEbp)))
    {
        return ;
    }

    DWORD dwFunReturnPath=0;

    if (false==ReadDebuggedMemory((PVOID)(dwEbp+1),4,_Out_ (BYTE*)(&dwFunReturnPath)))
    {

        return;
    }

    if (0!=(DWORD)dwNewEbp)
    {
        kRecur((DWORD*)dwNewEbp);
    }


    return ;

}

后来学优化的时候才发现它是一个尾递归。囧。

拷贝构造&拷贝赋值

当对一个对象有复制操作,如作为参数传入一个函数,以及:

class V
{
......
}
V*  CA=new V();
V   *CB=*CA();//发生拷贝构造

拷贝构造就是C++设计者给我们的一个机会,让我们在上面所说的事件发生时能做一些操作.
想把握控制这个机会的话,你需要声明如下:

    /*拷贝构造函数  */
    CExample(const CExample& C)  
    {  
       //......
    } 

赋值构造同样可以复制对象

    /*赋值构造  */
const CExmple& operator=(const CExmple& operator C)
    {
        //......
    }   

以上内容还被用在单例模式中。

语法灵活归灵活,但是不慎误用又没有错误提醒就惨了。

关于explict防止隐式类型转换得内容可参考:
C++关键字explict的详解和使用

关于主题更详细的内容可参看:
拷贝构造详解-ChinaUnix
推荐看这个:
拷贝构造函数详解
晚安
2016年5月13日 00:26:19
修订
2016年5月23日 21:29:37

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值