程序員數(shù)據(jù)結(jié)構(gòu)筆記(四)

字號:

枚舉:
    背包問題:
    枚舉策略:1)可能的方案:2N
      2)對每一方案進行判斷.
    枚舉法一般流程:
     while(還有其他可能方案)
     { 按某種順序可難方案;
    檢驗方案;
    if(方案為解)
     保存方案;
    }
     }
    枚舉策略:
    例:把所有排列枚舉出來 P6=6!.
    Min:123456
    Max:654321
    a1a2a3a4a5a6=>?(下一排列)=>?
    比如:312654的下和種情況=>314256
    遞歸
    遞歸算法通常具有這樣的特征:為求解規(guī)模為N的問題,設法將它分解成一些規(guī)模較小的問題,然后從這些較小問題的解能方便地構(gòu)造出題目所需的解。而這些規(guī)模較小的問題也采用同樣的方法分解成規(guī)模更小的問題,通過規(guī)模更小的問題構(gòu)造出規(guī)模校小的問題的解,如此不斷的反復分解和綜合,總能分解到最簡單的能直接得到解的情況。
    因此,在解遞歸算法的題目時,要注意以下幾點:
    1) 找到遞歸調(diào)用的結(jié)束條件或繼續(xù)遞歸調(diào)用條件.
    2) 想方設法將處理對象的規(guī)??s小或元素減少.
    3) 由于遞歸調(diào)用可理解為并列同名函數(shù)的多次調(diào)用,而函數(shù)調(diào)用的原則是一層一層調(diào)用,一層一層返回.因此,還要注意理解調(diào)用返回后的下一個語句的作用.在一些簡單的遞歸算法中,往往不需要考慮遞調(diào)用返回后的語句處理.而在一些復雜的遞歸算法中,則需要考慮遞歸調(diào)用返回后的語句處理和進一步的遞歸調(diào)用.
    4) 在讀遞歸程序或編寫遞歸程序時,必須要牢記遞歸函數(shù)的作用,這樣便于理解整個函數(shù)的功能和知道哪兒需要寫上遞歸調(diào)用語句.當然,在解遞歸算法的題目時,也需要分清遞歸函數(shù)中的內(nèi)部變量和外部變量.
    表現(xiàn)形式:
    ●定義是遞歸的(二叉樹,二叉排序樹)
    ●存儲結(jié)構(gòu)是遞歸的(二叉樹,鏈表,數(shù)組)
    ●由前兩種形式得出的算法是遞歸的
    一般流程: function(variable list(規(guī)模為N))
    { if(規(guī)模小,解已知) return 解;
     else {
    把問題分成若干個部分;
    某些部分可直接得到解;
    而另一部分(規(guī)模為N-1)的解遞歸得到;
     }
    }
    例1:求一個鏈表里的元素.
    大家有沒想過這個問題用遞歸來做呢?
    非遞歸方法大家應該都會哦?
     Max(nodetype *h) {
    nodetype *p;
    nodetype *q; //存放含值的結(jié)點
    Int max=0;
    P=h;
    While(p!=NULL){
     if (maxdata) {
      max=p->data;
      q=p;
     }
     p=p->next;
    }
    return q;
     }
    下面真經(jīng)來了,嘻嘻嘻~~~
     *max(nodetype *h) {
    nodetype *temp;
    temp=max(h->next);
    if(h->data>temp->data)
     return h;
    else
     return temp;
     }
    大家有空想想下面這個算法:求鏈表所有數(shù)據(jù)的平均值(我也沒試過),不許偷懶,用遞歸試試哦!
    遞歸程序員考試題目類型:1)就是鏈表的某些操作(比如上面的求平均值)
             2)二叉樹(遍歷等)