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

帶你理解C語言中的漢諾塔公式

 更新時間:2022年01月20日 15:40:22   作者:Brant_zero  
大家好,本篇文章主要講的是帶你理解C語言中的漢諾塔公式,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下

漢諾塔公式

漢諾塔問題在數(shù)學(xué)層面的公式:

不用說,你看到這個公式一定一臉懵逼,我現(xiàn)在來講解這個公式的作用。

先來回想一下大象放冰箱要幾步,三步吧,打開冰箱,放進(jìn)去,關(guān)上門就行了,我們先不要去思考一些細(xì)碎的步驟,將一個復(fù)雜的問題先簡單化,再慢慢去分析。

那漢諾塔問題也是同樣的簡單三步:(假設(shè)有n個盤子)

一、把最大的盤子留在A柱,然后將其他的盤子全放在B柱。

二、把最大的盤子放到C柱。

三、然后將B柱上的所有盤子放到C柱。

這就是漢諾塔的流程,漢諾塔的精髓就是上面三句話。

n層漢諾塔有(2^n-1)次移動,來將盤子全部從A盤到C盤.

C語言遞歸公式

相應(yīng)我們可以寫出對應(yīng)的C語言遞歸公式:(n就是盤子的個數(shù),xyz就是柱子的名字)

相信你肯定有很多疑問,我們現(xiàn)在先來舉幾個例子再解釋問題吧。

 一個盤子就不說了,因為最大的盤子就是他,所以他直接就去C盤了。

兩層漢諾塔

共三步:把最大盤上面的全部放到B,然后最大盤去C,再把剩余的盤全部放到C就行了。

這是兩個盤,共移動三次就移動完了,那三個盤呢?

三層漢諾塔

 把全部過程堪稱一個整體,最大盤上面的所有盤全部看成一個整體,我們也只用執(zhí)行三個步驟,我們要利用把大事化小的觀點(diǎn),不要一上來就思考具體是怎么移動的,這樣看不清問題的本質(zhì)。

我們再來具體分析三步具體要怎么移動.

第一步中,我們要移動三次,分別是A->C、是A->B、C->B這就是一大次完整的移動,在這一步中,我們套用了上一次的漢諾塔公式進(jìn)行使用,這就是漢諾塔的難點(diǎn),接下來我給大家看個圖,希望大家能理解,(n是層數(shù),X,Y,Z則是函數(shù)參數(shù))

 漢諾塔的內(nèi)部其實(shí)就像一個金字塔一樣,其實(shí)每一次調(diào)用自己,就是按照上面所說精髓的公式調(diào)用自己,讓自己的參數(shù)發(fā)生了變化。我希望大家能夠自己去照著畫一下流程,

第二步:將A到C,這就是將上圖的第二步那寫上第四次移動:A->C。

第三步,將B柱上的全部盤子借助A放到C

第七步完成后就會發(fā)現(xiàn)沒有要執(zhí)行的語句了,漢諾塔函數(shù)就結(jié)束返回到main函數(shù)了,自此求解漢諾塔函數(shù)的步驟就完成了。

好的,這樣,我們移動三層漢諾塔的過程的就完成了,三次漢諾塔完成就算是解決了這個問題,因為即使盤子再多也就是一樣的公式套用而已,明白兩層和三層漢諾塔的運(yùn)行原理就可以了,再多層的塔也是相同的流程。不難發(fā)現(xiàn),遞歸就是讓數(shù)學(xué)公式在C語言中體現(xiàn)了出來,讓問題變的十分”簡單“。

剩下就是了程序的主函數(shù)部分了,這個問題的主函數(shù)就很簡單,主函數(shù)只用傳來盤子的數(shù)量和三個柱子的名字就行了;代碼如下

#include <stdio.h>
void change (char x,char y)     //打印盤子移動軌跡的函數(shù)
{
    printf("%c->%c\n", x, y);
}
void f(n, x, y, z)              //漢諾塔函數(shù)
{
    if (n == 1)
    {
        change(x, z);
    }
    else
    {
        f(n - 1, x, z, y);      //公式一:將A柱最大盤外的盤子借助C柱移到B柱
            change(x, z);       //公式二:將A上最大盤移動到C柱
        f(n - 1, y, x, z);      //公式三:將B柱上的盤借助A全部放到C柱
    }
}
int main()
{
    int m;
    scanf("%d", &m);
    f(m, 'A', 'B', 'C');
}

總結(jié)

到此這篇關(guān)于帶你理解C語言中的漢諾塔公式的文章就介紹到這了,更多相關(guān)C語言漢諾塔公式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt5開發(fā)視頻播放器的項目實(shí)踐

    Qt5開發(fā)視頻播放器的項目實(shí)踐

    Qt對音視頻的播放和控制、相機(jī)拍攝、收音機(jī)等多媒體應(yīng)用提供了強(qiáng)大的支持,本文主要介紹了Qt5開發(fā)視頻播放器,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • C++ LeetCode1812判斷國際象棋棋盤格子顏色

    C++ LeetCode1812判斷國際象棋棋盤格子顏色

    這篇文章主要為大家介紹了C++ LeetCode1812判斷國際象棋棋盤格子顏色, 有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Qt中互斥鎖QMutex和QMutexLocker的使用

    Qt中互斥鎖QMutex和QMutexLocker的使用

    本文主要介紹了Qt中互斥鎖QMutex和QMutexLocker的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • C++中異常處理的基本思想及throw語句拋出異常的使用

    C++中異常處理的基本思想及throw語句拋出異常的使用

    這篇文章主要介紹了C++中異常處理的基本思想及throw類拋出異常的使用,也深入談到了異常被拋出后的棧解旋unwinding過程,需要的朋友可以參考下
    2016-03-03
  • 必須知道的C語言八大排序算法(收藏)

    必須知道的C語言八大排序算法(收藏)

    這篇文章主要介紹了C語言八大排序算法的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-10-10
  • C語言版二值圖像統(tǒng)計連通區(qū)域

    C語言版二值圖像統(tǒng)計連通區(qū)域

    這篇文章主要為大家詳細(xì)介紹了C語言版二值圖像統(tǒng)計連通區(qū)域的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Linux c中define的用法小結(jié)

    Linux c中define的用法小結(jié)

    學(xué)習(xí)了這么多年C語言,說實(shí)話對宏自以為了如指掌了,沒想到看內(nèi)核代碼的時候還是那么吃力,設(shè)備驅(qū)動代碼中有很多這樣或者那樣的宏定義,各種define,在學(xué)習(xí)的過程中將C語言中所出現(xiàn)的#define定義整理總結(jié)了一下,供大家借鑒和學(xué)習(xí)。
    2016-01-01
  • Linux編程實(shí)現(xiàn)制作文件的ed2k鏈

    Linux編程實(shí)現(xiàn)制作文件的ed2k鏈

    這篇文章主要介紹了Linux編程實(shí)現(xiàn)制作文件的ed2k鏈的相關(guān)資料,需要的朋友可以參考下
    2015-03-03
  • 求子數(shù)組最大和的解決方法詳解

    求子數(shù)組最大和的解決方法詳解

    本篇文章是對求子數(shù)組最大和的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 詳解在C++中顯式默認(rèn)設(shè)置的函數(shù)和已刪除的函數(shù)的方法

    詳解在C++中顯式默認(rèn)設(shè)置的函數(shù)和已刪除的函數(shù)的方法

    這篇文章主要介紹了在C++中顯式默認(rèn)設(shè)置的函數(shù)和已刪除的函數(shù)的方法,文中講到了C++11標(biāo)準(zhǔn)中的新特性,需要的朋友可以參考下
    2016-01-01

最新評論

囊谦县| 新津县| 西宁市| 丁青县| 信丰县| 平泉县| 吴忠市| 大田县| 大田县| 普兰县| 贵定县| 永清县| 永丰县| 英德市| 台东市| 大悟县| 泊头市| 海门市| 平潭县| 隆回县| 甘泉县| 水富县| 娄底市| 疏勒县| 天镇县| 布尔津县| 清丰县| 盐池县| 年辖:市辖区| 郴州市| 陕西省| 栾城县| 彭泽县| 墨江| 龙岩市| 泸州市| 奈曼旗| 阳山县| 湘西| 浦北县| 来宾市|