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