看完必會的漢諾塔以及遞迴理解

2021-09-29 02:39:35 字數 1859 閱讀 4427

長篇警告

全部都是在學習過程中自己的理解,若其中有誤請及時提出,以便修改

遞迴是我們學習過程中必不可少的一部分,很多剛入門的同學無法理解遞迴的含義,或者只是知道這是一種自己呼叫自己的函式,但是並不知道原理以及原因。

在遞迴呼叫中,有直接呼叫自己和間接呼叫自己。無論是直接還是間接都是相同的,沒有什麼差別。

在我看來的遞迴,就是將乙個大問題拆分為自己本身與子問題的過程,然後逐步解決子問題(當自己本身沒有子問題時即遞迴結束)。當子問題全部解決完,大問題也將輕而易舉地完成。

可能上述的話有點不好理解,接下來我將用階乘的例子說明!

在此定義乙個遞迴函式fun()

int

fun(

int n)

else

}

假如此時需要計算4!

那麼大問題就是解決4!,自身就是4,子問題便是3!

【說明】當知道3!的結果時,便可輕鬆解決4!。因此,可將大問題拆解為,「自己本身–>4」和「子問題–>3!」;

第一步:拆解為【 "4"和「3!」】

此時1!再沒有子問題,因此遞迴結束!!!

將所有的子問題與本身結合便可得出大問題的結果!

漢諾塔很多在學習的時候並未真正的理解,或許只是知道原理,知道**怎麼寫,但是完全憑藉記憶力,背下來的**!

接下來我就圖形解讀和**解讀!從原理到**的一步一步的理解!

漢諾塔是學習遞迴中的經典例子之一!

首先我們需要知道物理中的一種方法便是"整體法"。利用上述所說,便是將所有的子問題看成乙個整體,之後再慢慢解決。

漢諾塔**原理

其中有3個柱子,為x、 y、 z。分別賦予其他名字。此時稱x為移動柱,y為借助柱,z為目標柱子!

如圖!假設此時有4個盤子,需要從x依次移到z上。

此時將問題拆解。【自己本身–>第四個盤子從x到z】【子問題–>前三個視為整體移到y】

(此時前三個盤子在y柱上,便稱y為移動柱)

繼續將子問題拆解。【自己本身–>第三個盤子從y到z】【子問題–>前兩個視為整體移到x】

繼續拆解。【自己本身–>第二個盤子從x到z】【子問題–>將最上面的盤子從x移到y】

漢諾塔**解讀

因此,圖的邏輯便為如此。接下來是**的解讀!

重點

第乙個引數為盤子數,第二個引數是移動柱,第三個引數是借助柱,第四個引數是目標柱。每次的移動柱和借助柱都互換,所以每次函式呼叫時引數內容不同!!切不可認為每次移動柱與借助柱一成不變!!!

void

hanoi

(int n,

char x,

char y,

char z)

else

}

【說明】:在函式呼叫時,若此時該函式呼叫未全部執行完,就不會繼續向下執行**!

漢諾塔 遞迴

個人理解遞迴函式的基本要求就是,函式中呼叫函式本身,滿足特定的條件後返回。include include include include include include include include include include include include include 標頭檔案引用的較多...

遞迴漢諾塔

遞迴問題 遞迴要有三個要素 1.遞迴結束條件 2.遞迴結束時的處理 3.抽取重複的邏輯,剝離外殼 重點都在這一步 漢諾塔問題 把圓盤從下面開始按大小順序重新擺放在另一根柱子上。且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。首先,要搞這個編碼得要知道漢諾塔的解題思路 1.把a塔上...

遞迴 漢諾塔

漢諾塔問題。這裡順便可以求出一共需要搬運的次數。以下是漢諾塔問題的解法 class hanoi from 搬運的起點,to 搬運的目標地,middle 臨時中轉地 private static int hanoi int level,char from,char to,char middle int...