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

来源:互联网 发布:淘宝的正品保证有用吗 编辑:程序博客网 时间:2024/06/05 03:27

尾递归优化

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

怎么优化呢?

用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

1 0
原创粉丝点击