從漢諾塔到遞迴的探索和疑問

2021-07-14 15:47:48 字數 1456 閱讀 1501

/**********************************/

#include "stdafx.h"

void hanoi(int n,char a,char b,char c);

void move(int n,char a,char b);

int _tmain(int argc, _tchar* argv)

void hanoi(int n,char a,char b,char c)

else

} void move(int n,char a,char b)

//思考1:雖然可以借助把n-1看做整體的方法來解決這個問題,但是還是不能深刻理解盤子在移動的規律,簡單說就是沒有電腦程式這個怎麼做。

//思考2:遞迴是自己呼叫自己,然後從乙個固定的截至條件向前推理,這是個辦法。但是誰能保證可以推的通, 萬一沒有推的通呢?

//思考3:遞迴和迭代是怎麼轉化的?

//思考4:深入理解遞迴的表現格式和內在流程。

迭代與遞迴的區別

遞迴的基本概念:程式呼叫自身的程式設計技巧稱為遞迴,是函式自己呼叫自己. a—–>a

乙個函式在其定義中直接或間接呼叫自身的一種方法,它通常把乙個大型的複雜的問題轉化為乙個與原問題相似的規模較小的問題來解決,可以極大的減少**量.遞迴的能力在於用有限的語句來定義物件的無限集合。

使用遞迴要注意的有兩點:

1)遞迴就是在過程或函式裡面呼叫自身;

2)在使用遞迴時,必須有乙個明確的遞迴結束條件,稱為遞迴出口.

遞迴分為兩個階段:

1)遞推:把複雜的問題的求解推到比原問題簡單一些的問題的求解;

2)回歸:當獲得最簡單的情況後,逐步返回,依次得到複雜的解.

利用遞迴可以解決很多問題:如揹包問題,漢諾塔問題,…等.

斐波那契數列為:0,1,1,2,3,5…

fib(0)=0;

fib(1)=1;

fib(n)=fib(n-1)+fib(n-2);

int fib(int n)

上面就是乙個簡單的遞迴呼叫了.由於遞迴引起一系列的函式呼叫,並且有可能會有一系列的重複計算,遞迴演算法的執行效率相對較低.

迭代:利用變數的原值推算出變數的乙個新值.如果遞迴是自己呼叫自己的話,迭代就是a不停的呼叫b. a------>b

遞迴中一定有迭代,但是迭代中不一定有遞迴,大部分可以相互轉換.能用迭代的不用遞迴,遞迴呼叫函式,浪費空間,並且遞迴太深容易造成堆疊的溢位.

//這是遞迴  

int funca(int n)

`

``

//這是迭代

int funcb(int n)

從漢諾塔看遞迴

很開心今天搞明白了漢諾塔的方法遞迴。走了很多的彎路,今天分享自己的一些思考的過程以及結果。希望對有需要的同學們有所幫助。題目 漢諾塔由三根柱子 分別用x y z表示 和n個大小互不相同的空心盤子組成。一開始n個盤子都摞在柱子x上,大的在下面,小的在上面,形成了乙個塔狀的錐形體。對漢諾塔的一次合法的操...

從漢諾塔問題看遞迴

看 資料結構,演算法與應用c 語言描述 一文中第185頁出現了乙個漢諾塔問題。這是個遞迴問題,想了好久終於在今天想懂了一點點 用起來說實在的還是濛濛的 include include include using namespace std void move int n,int x,int y,in...

漢諾塔的遞迴解法

遇到這題,就覺得我的理解能力和表達能力不行,用了好長時間把這題弄懂,然而又不知道怎麼用語言表述。要先找到 n 1的是基例,當只有一塊時,直接從a移動到c就完成了 然後再解決n的問題,都可以看成 先把 a柱 n 1 個盤子,先從a 移動到b,再將a最後乙個盤子從a 移動到c,最後將n 1個盤子從b移動...