【演算法】遞迴(recursion)+經典例題個人分析

來源:互聯網
上載者:User

定義(個人理解)

1.自己調用比自己小一個規模的自己。

2.有結束條件。

3.對問題的細化。


ps: 大家可以通過這個效應感性的感受一下遞迴。

德羅斯特效應:



************************************************************************************************************************************************


遞迴條件 當然並不是所有的問題都能夠用遞迴來實現。能夠實現遞迴,需要滿足以下條件:
1.有遞迴公式。問題能夠分解為一個一個於自身類似的小問題。 2.有確切的邊界。能夠最後分解為一個有確定解的問題。
輔助分析圖:

個人覺得,這個圖應該是能夠比較清晰地反映遞迴的調用了。 我們可以把遞迴調用看作是在原本的f()函數中又添加了f()函數的代碼,只是現在的參數與原來不同罷了。只有當到達邊界的時候,函數才會一層一層的被返回。也就是一個一個的問題被完成返回後,最外層的函數才會真正被完成也返回。


不太懂。沒關係,咱們從執行個體中去理解遞迴~ ************************************************************************************************************************************************
經典例題(個人分析) 該排版由易到難,請各位看客根據自己的需求翻閱。
階乘
問題描述:請輸入一個n值,輸出n!的值。
code:

運行結果:

變式1:完成Fibonacci數列 變式2:完成Ackerman函數 (答案在最後~)
是不是覺得遞迴很簡單呢。下面咱們再繼續吧~

****************************************************************************************************************

漢諾塔問題
問題描述:假設有3個分別命名為X、Y和Z的塔座,在塔座X上插有n個直徑大小各不相同、按從小到大編號為1,2,..., n的圓盤(如圖所示)。現要求將X軸上的n個圓盤移至塔座Z上並仍按同樣順序疊排,圓盤移動時必須遵循下列規則: (1)每次只能移動一個圓盤; (2)圓盤可以插在X、Y和Z中的任一塔座上; (3)任何時刻都不能講一個較大的圓盤壓在較小的圓盤之上。 請問如何移。要移多少次。
code:

運行結果:

如果感覺有點暈的話也可以: 1.採取最開始解釋的方法去看,就是在原來最開始的函數中添加了代碼。 2.帶入實際資料進去跟著程式運行一遍。 3.看下面動圖~     


漢諾塔棧方法解決:http://www.cricode.com/304.html
****************************************************************************************************************
八皇后問題
問題描述:經典的八皇后問題,即在一個8*8的棋盤上放8個皇后,使得這8個皇后無法互相攻擊( 任意2個皇后不能處於同一行,同一列或是對角線上),輸出所有可能的擺放情況。
code:


#include <iostream>using namespace std;int c[20],n=8,cnt=0;void print(){ //列印    for(int i=0;i<n;++i){        for(int j=0;j<n;++j){            if(j==c[i])cout<<"1 ";            else cout<<"0 ";        }        cout<<endl;    }    cout<<endl;}void search(int r){    if(r==n){ //當已經排到最後一個皇后的時候位置一定固定。【條件2】        print();        ++cnt;        return;    }    for(int i=0;i<n;++i){ //r表示第幾行        c[r]=i; //c[r]=i,表示第r行第i列        int ok=1;        for(int j=0;j<r;++j)            if(c[r]==c[j]||r-j==c[r]-c[j]||r-j==c[j]-c[r]){ //判斷是否在同一列,是否在主對角線或副對角線上【條件1】                ok=0;                break;            }        if(ok)search(r+1); //r+1必定不在同一行,故不用判斷是否在一行    }}int main(){    search(0);    cout<<cnt<<endl;    return 0;}

運行結果部分截屏:



****************************************************************************************************************
Answer: 變式1:使用公式f[n]=f[n-1]+f[n-2],依次遞迴計算,遞迴結束條件是f[1]=1,f[2]=1。
變式2:使用公式Ack(m,n)=Ack(m-1,Ack(m,n-1)),依次遞迴計算,遞迴結束條件n=0時,Ack(m,n)=Ack(m-1,1);m=0時,Ack(m,n)=n+1。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.