最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言遞歸:漢諾塔問題分析

 更新時間:2023年01月24日 11:58:16   作者:持續(xù)進化中  
這篇文章主要介紹了C語言遞歸:漢諾塔問題分析的相關資料,需要的朋友可以參考下

問題背景

漢諾塔問題源自印度一個古老的傳說,印度教的“創(chuàng)造之神”梵天創(chuàng)造世界時做了 3 根金剛石柱,其中的一根柱子上按照從小到大的順序摞著 64 個黃金圓盤。梵天命令一個叫婆羅門的門徒將所有的圓盤移動到另一個柱子上,移動過程中必須遵守以下規(guī)則:

每次只能移動柱子最頂端的一個圓盤;每個柱子上,小圓盤永遠要位于大圓盤之上;

游戲體驗

點擊開始體驗游戲:??漢諾塔游戲 (gitee.io)??

遞歸:漢諾塔問題_遞歸

漢諾塔移動次數(shù)規(guī)律

個數(shù)

移動次數(shù)f(n)

規(guī)律

1

1

2^1-1

2

3

2^2-1

3

7

2^3-164-1

4

15

2

...

...

...

n

2^n-1

2^n-1

由上述分析可以得到f(n)與f(n-1)的關系:  

所以:f(n)=2^n-1 ; f(n-1)=2^(n-1)-1

 f(n)=2^n-1=2^1*(2^(n-1)-1)+1=2*f(n-1)+1

移動過程的深層解讀

漢諾塔問題的三步過程歸納

(我們是把n-1個圓盤看成一個整體去分析的)

 一.把n-1個圓盤從A(經(jīng)過C)移到B

遞歸:漢諾塔問題_代碼實現(xiàn)_02

 二. 把A上第n個圓盤移到C

遞歸:漢諾塔問題_漢諾塔_03

 三: 把B上的(n-1)個圓盤(經(jīng)過A)移到C

遞歸:漢諾塔問題_算法_04

重點!?。?!

中間的一步是把最大的一個盤子由A移到C上去;A->C
(1)中間一步之前可以看成把A上n-1個盤子通過借助C塔移到了B上,A->B
(2)中間一步之后可以看成把B上n-1個盤子通過借助A塔移到了C上;B->C

圖解:

階數(shù)

步驟

1

A->C

2

A->B,A->C,B->C

3

A->C,A->B,C->B,A->C,B->A,B->C,A->C

4

A->B,A->C,B->C,A->B,C->A,C->B,A->B,A->C,B->C,B->A,C->A,B->C,A->B,A->C,B->C

...

...

奇數(shù)

第一步A->C

偶數(shù)

第一步A->B

發(fā)現(xiàn):

奇數(shù)個圓盤第一步永遠為A–>C

偶數(shù)個圓盤第一步永遠為A–>B

代碼實現(xiàn)1

僅打印移動次數(shù)

#include<stdio.h>
int Tower(int num)
{
if(num==1)
return 1;
else
return 2*Tower(num-1)+1;
}
int main()
{
int num=0;
int ret=0;
printf("請輸入層數(shù):");
scanf("%d",&num);
ret=Tower(num);
printf("需要%d次完成\n",ret);
return 0;
}

關鍵步驟

if(num==1)
return 1;
else
return 2*Tower(num-1)+1;

遞歸:漢諾塔問題_遞歸_05

代碼實現(xiàn)2

打印移動的具體過程

#include <stdio.h>
void Move(char A,char C)
{
printf("%c --> %c\n",A,C);
}
void tower(int a,char A,char B,char C)//漢諾塔函數(shù)實施主體,A為初始柱,B為經(jīng)由柱,C為目的柱
{
if (a==1)
{
Move(A,C);
}
else
{
tower(a-1,A,C,B);//把n-1個圓盤從A(經(jīng)過C)移到B
Move(A,C);
tower(a-1,B,A,C);//把B桿上的(n-1)個圓盤(經(jīng)過A)移到C
}
}
int Tower(int num)
{
if (num==1)
return 1;
else
return 2*Tower(num-1)+1;
}
int main()
{
int a = 0;
int Num=0;
printf("請輸入層數(shù):");
scanf("%d",&a);
Num = Tower(a);
printf("%d層需要移動%d步\n", a, Num);
tower(a, 'A', 'B', 'C');//進入遞歸
return 0;
}

遞歸:漢諾塔問題_#include_06

補充

進階題:移動盤子的過程中只能夠相鄰柱間移動,結論:移動次數(shù):f(n)=3^n-1

到此這篇關于C語言遞歸:漢諾塔問題分析的文章就介紹到這了,更多相關遞歸:漢諾塔問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言實現(xiàn)簡單計算器程序

    C語言實現(xiàn)簡單計算器程序

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單計算器程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++中using的三種用法舉例詳解

    C++中using的三種用法舉例詳解

    最近在使用中,發(fā)現(xiàn)了一種以前沒學過的using用法,于是在這里,將using的幾種用法總結一下,下面這篇文章主要給大家介紹了關于C++中using的三種用法,需要的朋友可以參考下
    2023-02-02
  • 詳解C++?STL模擬實現(xiàn)list

    詳解C++?STL模擬實現(xiàn)list

    這篇文章主要為大家詳細介紹了C++如何模擬實現(xiàn)STL容器list,文中的示例代碼講解詳細,對我們學習C++有一定幫助,需要的可以參考一下
    2023-01-01
  • C語言數(shù)組指針的小例子

    C語言數(shù)組指針的小例子

    這篇文章介紹了,用c語言實現(xiàn)的一個數(shù)組指針的小例子,有需要的朋友可以參考一下
    2013-07-07
  • 詳談signed 關鍵字

    詳談signed 關鍵字

    c++中關鍵字有幾十個,其中類型修飾關鍵字有l(wèi)ong, short, singed, unsigned。今天我們就來談一下經(jīng)常被大家忽視的signed關鍵字
    2015-01-01
  • Qt讀寫XML文件的方法詳解(含源碼+注釋)

    Qt讀寫XML文件的方法詳解(含源碼+注釋)

    XML文件可以用來存儲項目中的數(shù)據(jù),它相當于一個簡單的數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關于Qt讀寫XML文件(含源碼+注釋)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • C語言實現(xiàn)簡單的貪吃蛇游戲

    C語言實現(xiàn)簡單的貪吃蛇游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單的貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C語言編程數(shù)據(jù)結構的棧和隊列

    C語言編程數(shù)據(jù)結構的棧和隊列

    本篇文章是C語言編程篇,主要為大家介紹C語言編程中的數(shù)據(jù)結構,詳細的講解了數(shù)據(jù)結構的棧和隊列有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • C++ 如何將string轉(zhuǎn)換成全小寫

    C++ 如何將string轉(zhuǎn)換成全小寫

    這篇文章主要介紹了C++ 如何將string轉(zhuǎn)換成全小寫問題,具有很好的參考價值,希望對大家有所幫助。
    2022-11-11
  • C語言指針超詳細講解下篇

    C語言指針超詳細講解下篇

    指針提供了對地址操作的一種方法,因此,使用指針可使得?C?語言能夠更高效地實現(xiàn)對計算機底層硬件的操作。另外,通過指針可以更便捷地操作數(shù)組。在一定意義上可以說,指針是?C?語言的精髓
    2022-04-04

最新評論

周至县| 永清县| 宁阳县| 瑞安市| 启东市| 南乐县| 长寿区| 北安市| 花垣县| 田阳县| 堆龙德庆县| 灯塔市| 醴陵市| 丹凤县| 辽宁省| 新宾| 昔阳县| 盘山县| 石林| 涞源县| 元朗区| 东乌珠穆沁旗| 张家港市| 安图县| 峨边| 札达县| 波密县| 洞头县| 宝兴县| 福鼎市| 叶城县| 张家港市| 霍山县| 错那县| 北安市| 大足县| 延庆县| 井研县| 吉木乃县| 奎屯市| 曲麻莱县|