漢諾塔
用C小伙伴肯定都聽過這樣一句話:“能用不用遞歸就不用遞歸”溉贿,無數(shù)的前輩告訴我們枫吧,慎用指針和遞歸,但柳貓今天要告訴你宇色,指針和遞歸思想九杂,是C語言編程的核心和靈魂颁湖,只要涉及復(fù)雜的C語言編程,就絕對繞不開這兩兄弟例隆。
遞歸最經(jīng)典的莫過于漢諾塔了甥捺,漢諾塔(Towers of Hanoi)是法國人M.Claus(Lucas)于1883年從泰國帶至法國的,河內(nèi)為越戰(zhàn)時(shí)北越的首都裳擎,即現(xiàn)在的胡志明市涎永;1883年法國數(shù)學(xué)家 Edouard Lucas曾提及這個(gè)故事。
據(jù)說創(chuàng)世紀(jì)時(shí)Benares有一座波羅教塔鹿响,是由三支鉆石棒(Pag)所支撐羡微,開始時(shí)神在第一根棒上放置64個(gè)由上至下依由小至大排列的金盤(Disc),并命令僧侶將所有的金盤從第一根石棒移至第三根石棒惶我,且搬運(yùn)過程中遵守大盤子在小盤子之下的原則妈倔,若每日僅搬一個(gè)盤子,則當(dāng)盤子全數(shù)搬運(yùn)完畢之時(shí)绸贡,此塔將毀損盯蝴,而也就是世界末日來臨之時(shí)。
實(shí)現(xiàn)算法
解法如果柱子標(biāo)為ABC听怕,要由A搬至C捧挺,在只有一個(gè)盤子時(shí),就將它直接搬至C尿瞭,當(dāng)有兩個(gè)盤子闽烙,就將B當(dāng)作輔助柱。如果盤數(shù)超過2個(gè)声搁,將第三個(gè)以下的盤子遮起來黑竞,就很簡單了,每次處理兩個(gè)盤子疏旨,也就是:A->B很魂、A ->C、B->C這三個(gè)步驟檐涝,而被遮住的部份遏匆,其實(shí)就是進(jìn)入程式的遞回處理。
#include <stdio.h>
void hanoi(int n, char A, char B, char C) {
if(n == 1) {
printf("Move sheet %d from %c to %c\n", n, A, C);
}
else {
hanoi(n-1, A, C, B);
printf("Move sheet %d from %c to %c\n", n, A, C);
hanoi(n-1, B, A, C);
}
}
int main() {
int n;
printf("請輸入盤數(shù):");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}
事實(shí)上谁榜,若有n個(gè)盤子拉岁,則移動完畢所需之次數(shù)為2^n - 1,所以當(dāng)盤數(shù)為64時(shí)惰爬,則所需次數(shù)為:264- 1 = 18446744073709551615為5.05390248594782e+16年,也就是約5000世紀(jì)惫企,如果對這數(shù)字沒什幺概念撕瞧,就假設(shè)每秒鐘搬一個(gè)盤子好了陵叽,也要約5850億年左右。
在VS2017上運(yùn)行效果如下圖
漢諾塔搬盤子的功能我們就實(shí)現(xiàn)了丛版,當(dāng)然巩掺,如果還有疑問的小伙伴可以直接聯(lián)系我,也可以加群710520381页畦,邀請碼:柳貓胖替,跟你們不見不散……