將問題轉化爲同類問題的子問題進行求解。算法
1.漢諾塔問題: 函數
描述:64個盤子從a移到c,要求一次只能移動一個盤子,而且小盤子在上,大盤子在下。spa
void hanoi(int n,char a,char b,char 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軸上!
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);//關冰箱門 } }
#include<stdio.h> int main() { int n; printf("請輸入盤子個數:\n); scanf("%d",&n); hanoi(n,a,b,c);//調用函數 return 0; }