算法與數據結構之遞歸算法

1.遞歸算法的核心思想:

將問題轉化爲同類問題的子問題進行求解。算法

2.遞歸算法的應用:

  • 漢諾塔

3.問題分析:

1.漢諾塔問題: 函數

clipboard.png
描述:64個盤子從a移到c,要求一次只能移動一個盤子,而且小盤子在上,大盤子在下。spa

編寫功能函數:

void hanoi(int n,char a,char b,char c)
  • 含義:
    n:盤子數量。
    a,b,c:三個軸。
  • 思路:
    n=1時,只須要將盤子從a移動到C便可。記做:a->c。
    n>1時,進行以下思考:翻譯

技巧:code

咱們知道裝大象的步驟以下:

1.打開冰箱
2.裝大象
3.關冰箱門 遞歸

觀察以下圖: 遊戲

圖片描述

接下來,咱們將要打開冰箱
圖片描述圖片

咱們發現當n=2時,漢諾塔遊戲能夠抽象成一個裝大象的過程,過程及其簡單易懂。
事實上,不管n爲多少,咱們均可以吧漢諾塔抽象成兩個來看,也就是將兩個當作一個總體!
圖片描述ip

而那兩個模塊(冰箱)咱們又能夠把它當作一次大象裝冰箱的過程,也就是說3個盤子模塊會實現2次裝大象的過程。
隨着盤子數量愈來愈多,裝大象的過程愈來愈多,咱們能夠利用函數調用自身函數達到重複循環裝的做用,固然你也能夠選擇for循環,咱們這裏討論遞歸思想。it


語句等價翻譯

hanoi(n-1,a,c,b);//該語句表明打開冰箱!  
a->c;//該語句表明裝大象!  
hanoi(n-1,b,a,c);//該語句表明關冰箱門!

具體分析:
hanoi(n-1,a,c,b):表示將冰箱從a這個地方繞過c軸到達b軸這個地方。其中n-1表明冰箱!
a->c:表示將a軸上的最後一個模塊盤子(最大的,最底部的大象)直接送到c軸上去!
hanoi(n-1,b,a,c):表示將b軸上的的冰箱繞過a關到c軸上!

以上分析表示了裝大象的過程,也是漢諾塔遊戲的過程。

4.hanoi函數的具體實現:

void hanoi(int n, char a,char b,char c)//定義hanoi函數
{
    if(n==1)
    printf("%c->%c",a,c);//若是隻有一個盤子,也就是說只有大象沒有冰箱門的時候,直接把大象裝進冰箱裏
    else
    {
        hanoi(n-1,a,c,b);//打開冰箱
        printf("%c->%c",a,c);//裝大象
        hanoi(n-1,b,a,c);//關冰箱門
    }
}

5.主函數的實現:

#include<stdio.h>
int main()
{
    int n;
    printf("請輸入盤子個數:\n);
    scanf("%d",&n);
    hanoi(n,a,b,c);//調用函數
    return 0;
}

6.代碼實現:

圖片描述

相關文章
相關標籤/搜索