這是漢諾塔吧。
創(chuàng)新互聯(lián)建站是一家專業(yè)提供上猶企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、HTML5、小程序制作等業(yè)務(wù)。10年已為上猶眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。
原理:(總共n個(gè)盤子)
1、將第一個(gè)位置(起始位置)上的n-1個(gè)盤子移到第二個(gè)位置上,此時(shí)第一個(gè)位置只剩第n個(gè)盤子
2、將第一個(gè)位置上的最后一個(gè)盤子(第n個(gè)盤子)移到第三個(gè)位置(目標(biāo)位置)上,再將第二個(gè)位置上的n-1個(gè)盤子移到第三個(gè)位置上。
你不需要曉得n-1個(gè)盤子如何從一個(gè)位置移到另一個(gè)位置,讓程序做。n--n-1--n-2......1,問題不斷的小化,當(dāng)n=1時(shí),直接從第一個(gè)位置移到第三個(gè)位置,再倒過來推1--2--3......--n。最終問題就會(huì)被解決。
hanoi()函數(shù)就是將問題小化,使n--1
move()函數(shù)中char x是起始位置,char y是目標(biāo)位置,即x--y.用A、B、C來顯示盤子是如何移動(dòng)的
由于是遞歸調(diào)用,所以,程序在打印結(jié)果的時(shí)候是從最內(nèi)層函數(shù)開始打印,于是,就得到136.因?yàn)檫f歸調(diào)用其實(shí)是嵌套調(diào)用,只是嵌套的是函數(shù)自身。這樣,需要將最內(nèi)層的函數(shù)執(zhí)行完畢,才開始執(zhí)行外層的,一層一層往外執(zhí)行完畢,最后是main函數(shù)。若將遞歸還原為順序程序,流程是這樣:樓主得到的631其實(shí)是從6開始被存放到某堆棧中的,這樣,1便成為最頂上的數(shù),而6成為最底部的數(shù)。而最后打印的時(shí)候,需要彈棧,出棧順序?yàn)椋鹤皂斚蛳鲁鰲?,于是,得到的結(jié)果為136樓主的解題過程是對(duì)的,但可能沒理解遞歸的意義。建議樓主翻閱關(guān)于遞歸的相關(guān)文章看看。
if (n 1)
return (n*fun(n-1));
return 1;
如果 n1 執(zhí)行 return (n*fun(n-1)); 否則執(zhí)行 return 1;
因?yàn)?main 函數(shù)里調(diào)用的是 fun(10); 所以對(duì)于 fun 函數(shù),入口參數(shù) n 等于10;10 大于 1,所以執(zhí)行 return (n*fun(n-1)); 又調(diào)用了 fun(9)。。。
就這樣一直調(diào)用到 fun(1); 此時(shí) n 1 不成立,所以不執(zhí)行
return (n*fun(n-1));
而是執(zhí)行下一句 return 1; 這樣就返回到上一層 fun(2) 的return語句處,即
return ( 2 * fun( 1 ) ); fun(2) 繼續(xù)向上返回,直到 fun(10);
枚舉每一個(gè)開始點(diǎn),向每一個(gè)方向枚舉。
有一個(gè)簡便的寫法是定義確定方向的數(shù)組
const?int?dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}