程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 經典遞歸——斐波那契數列,漢諾塔,斐波那契漢諾塔

經典遞歸——斐波那契數列,漢諾塔,斐波那契漢諾塔

編輯:關於C語言

經典遞歸——斐波那契數列,漢諾塔,斐波那契漢諾塔


斐波那契

漢諾塔

0 1 1 2 3 5 8 13 21

int fibonacci(int a){
    if(a==0)
        return 0;
    else if(a==1)
        return 1;
    else
        return fibonacci(a-1)+fibonacci(a-2);
}

我也來搞一下這個 漢諾塔的調調:

先來講一下這個 東西怎麼玩兒

需要做的事情是把 1針上的盤子都放到3針上面。

要求每次只能移動一個盤子,並且只能是大盤子在下,小盤子在上,對於每兩個盤子來說。

所以為了實現這一目的

Step1: 把1針上的最後一個盤子放到3針上面。//移動

【前提:這樣就需要先把n-1盤子放到2針上面。 也就是Step0:】

Step0:這樣就需要先把n-1盤子放到2針上面。//邏輯

 

//對於代碼,這句話本質上相當於 2針是目標,也就是 2針上是需要盛盤子的針。所以2針是目的針,要把n-1個盤子從1針放到2針上,借助3針,所以abc三根針的關系在hanoi(n,a,b,c)的本質是:a作為移出針,b作為借助針,c作為目標針。所以 這裡面這句話應該寫作:hanoi(n-1,a,c,b);

Step1:

Step2:前提把n-2個盤子放到1針上。//邏輯

所以從2針出來,放到1針上,借助,3針。這幾個參數就是213.

Step3:把2針上的最後一個盤子放到3針上。//移動

 

然後 把n-3個盤子放到2針上面,也就是 Step0:

然後再 Step1

所以 大概是這樣的:

void hanoi(int n,int a,int b,int c){    
    if(n==1) 
        printf("%d -> %d \n",a,c);//移動 
    else{
        hanoi(n-1,a,c,b);
        printf("%d -> %d \n",a,c);//移動 
        hanoi(n-1,b,a,c);
    }
}

運行結果:

代碼:

/**

#include <iostream>


int fibonacci(int);
void hanoi(int n ,int a,int b, int c);

int main(int argc, char** argv) {
    
    //printf("%d",fibonacci(1));
    hanoi(3,1,2,3);
    
    
    return 0;
}

void hanoi(int n,int a,int b,int c){
    
    
    if(n==1) 
        printf("%d -> %d \n",a,c);//移動 
    else{
        hanoi(n-1,a,c,b);
        printf("%d -> %d \n",a,c);//移動 
        hanoi(n-1,b,a,c);
    }
    
}
/**
    返回第a個數的大小,從0開始。 
*/
int fibonacci(int a){
    if(a==0)
        return 0;
    else if(a==1)
        return 1;
    else
        return fibonacci(a-1)+fibonacci(a-2);
}

*/

試試4個的:

 

大概那眼睛移動了一下,應該是沒有問題的。

再來回顧一下代碼:

/**
    n代表要移動的盤子的個數。 
    a 代表從哪跟針往外移出。  移出針 
    b代表借助哪跟針。         借助針 
    c代表要移動到哪根針。     目的針 
*/
void hanoi(int n,int a,int b,int c){
    if(n==1) 
        printf("%d -> %d \n",a,c);//移動 
    else{
        hanoi(n-1,a,c,b);//邏輯 
        printf("%d -> %d \n",a,c);//移動 
        hanoi(n-1,b,a,c);//邏輯 
    }
}

 

如果只有一個盤子,就把盤子直接從1移動到3.

否則就把n-1個盤子移動到2.

然後把盤子放到3上。

再把剩下的盤子從2移到3上。

 

應該可以開始默寫了

Hanoi(int n,int from,int rent,int destination){
    If(n==1) 
    printf("%d -> %d",from,destination);
    Else{
    Hanoi(n-1,from,destination,rent);
    Printf("%d ->%d",from,destination);
    Hanoi(n-1,rent,from,destination);
}

不看還是會忘的。總之這就是這麼個事兒,算法麼~大都是背下來的。哪有那麼多真正會的人。。。

 

以下源代碼:

#include <iostream>


int fibonacci(int);
void hanoi(int n ,int a,int b, int c);

int main(int argc, char** argv) {
    
    //printf("%d",fibonacci(1));
    hanoi(4,1,2,3);
    
    
    return 0;
}

/**
    n代表要移動的盤子的個數。 
    a 代表從哪跟針往外移出。  移出針 
    b代表借助哪跟針。         借助針 
    c代表要移動到哪根針。     目的針 
*/
void hanoi(int n,int a,int b,int c){
    if(n==1) 
        printf("%d -> %d \n",a,c);//移動 
    else{
        hanoi(n-1,a,c,b);//邏輯 
        printf("%d -> %d \n",a,c);//移動 
        hanoi(n-1,b,a,c);//邏輯 
    }
}

/**
    返回第a個數的大小,從0開始。 
*/
int fibonacci(int a){
    if(a==0)
        return 0;
    else if(a==1)
        return 1;
    else
        return fibonacci(a-1)+fibonacci(a-2);
}

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved