1. 程式人生 > >聊聊“尾遞迴優化“簡介拷貝構造&拷貝賦值

聊聊“尾遞迴優化“簡介拷貝構造&拷貝賦值

尾遞迴優化

尾遞迴.顧名思義,將本函式的工作結果作為引數,呼叫本函式,然後將其結果返回.
尾遞迴可以被優化.原因在於:在尾遞迴中我們不需要儲存上一次本函式呼叫的結果.因為我們已經在尾部了:)

怎麼優化呢?

用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)
    {
        //......
    }   

以上內容還被用在單例模式中。

語法靈活歸靈活,但是不慎誤用又沒有錯誤提醒就慘了。

關於主題更詳細的內容可參看:
拷貝構造詳解-ChinaUnix
推薦看這個:
拷貝建構函式詳解
晚安
2016年5月13日 00:26:19
修訂
2016年5月23日 21:29:37