<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          圖文詳解漢諾塔(附C語(yǔ)言實(shí)現(xiàn)代碼)

          共 1686字,需瀏覽 4分鐘

           ·

          2022-05-31 16:49

          ????關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容

          來(lái)源:http://a.nxw.so/1iDyQD



          一、前言


          漢諾塔(Tower of Hanoi),又稱(chēng)河內(nèi)塔,是一個(gè)源于印度古老傳說(shuō)的益智玩具。大梵天創(chuàng)造世界的時(shí)候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤(pán)。大梵天命令婆羅門(mén)把圓盤(pán)從下面開(kāi)始按大小順序重新擺放在另一根柱子上。并且規(guī)定,在小圓盤(pán)上不能放大圓盤(pán),在三根柱子之間一次只能移動(dòng)一個(gè)圓盤(pán)。



          二、漢諾塔打印步數(shù)

          1、不使用遞歸計(jì)算1個(gè)n層的漢諾塔從A柱到C柱的所有步數(shù)如下



          實(shí)現(xiàn)代碼:

          #define _CRT_SECURE_NO_WARNINGS#include#includeint main(){  int num = 0;  scanf("%d", &num);//塔數(shù)  printf("完成%d層的漢諾塔需要%d步\n", num, (int)pow(2,num) - 1);  return 0;}


          2、使用遞歸計(jì)算1個(gè)n層的漢諾塔從A柱到C柱的所有步數(shù)


          原理:

          • 將n-1個(gè)碟子從A桿經(jīng)C桿移動(dòng)到B桿

          • 將A桿上的第n個(gè)碟子移動(dòng)到C桿

          • 將n-1個(gè)碟子從B桿經(jīng)A桿移動(dòng)到C桿



          所以: f (n -1 ) + 1 + f (n - 1); ?->? 2 * f (n - 1) +1; 這個(gè)式子叫做遞推式

          實(shí)現(xiàn)代碼:

          #define _CRT_SECURE_NO_WARNINGS#includeint Hanio_twice(int num){  if(1 == num)    return 1;  else    return 2 * Hanio_twice(num - 1) + 1;}int main(){  int num = 0;    scanf("%d", &num);//塔數(shù)  int ret = Hanio_twice(num);  printf("完成%d層的漢諾塔需要%d步\n", num, ret);  return 0;}

          梵天說(shuō)假如把64個(gè)金片從A挪到C,那么這個(gè)世界就毀滅了(這里以上的代碼都不能輸出這個(gè)數(shù)字)
          推理得:


          2 ^ 64 - 1 -> 大約是1800億億步,這是個(gè)什么概念呢?
          1年有365天,每天24小時(shí),每小時(shí)是3600秒。如果1秒鐘移動(dòng)1次,如果把這64塊金片全部移動(dòng)完,大概需要5800億年。宇宙形成到現(xiàn)在也就138億年


          三、漢諾塔打印步驟


          使用遞歸打印1個(gè)n層的漢諾塔從A柱到C柱的所有步驟

          原理:封裝1個(gè)函數(shù)Hanio(num, ‘A’, ‘B’, ‘C’)。

          其中num是塔數(shù);A、B、C,3個(gè)字符為抽象成的3個(gè)柱子。

          如果只有1層那么輸出A;否則就有2種情況,其1是將n-1個(gè)碟子從A經(jīng)C到B。其2是將n-1個(gè)碟子從B經(jīng)A到C



          實(shí)現(xiàn)代碼:

          #define _CRT_SECURE_NO_WARNINGS#includevoid Hanio_Step(int n, char A, char B, char C){  if (1 == n)    printf("%c->%c\n", A, C);  else  {    Hanio_Step(n-1, A, C, B);    printf("%c->%c", A, C);    Hanio_Step(n-1, B, A, C);  }}int main(){  int n = 0;  scanf("%d", &n);  Hanio_Step(n, 'A', 'B', 'C');  return 0;}

          步驟剖析圖:
          注:圖片有點(diǎn)小大家可以放大點(diǎn)看
          scanf -> 2



          scanf -> 3 ???注:因?yàn)楹竺娴牟襟E太多了,所以省略一部分



          版權(quán)聲明:本文來(lái)源網(wǎng)絡(luò),免費(fèi)傳達(dá)知識(shí),版權(quán)歸原作者所有。如涉及作品版權(quán)問(wèn)題,請(qǐng)聯(lián)系我進(jìn)行刪除。

          ???????????????? ?END ????????????????

          關(guān)注我的微信公眾號(hào),回復(fù)“加群”按規(guī)則加入技術(shù)交流群。


          點(diǎn)擊“閱讀原文”查看更多分享,歡迎點(diǎn)分享、收藏、點(diǎn)贊、在看。

          瀏覽 101
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本大色情www成人亚洲 | 国产AV中文 | 国产性爱电影一区二区三区 | 人成无码| 中文字幕+乱码+中文乱码电影 |