第三章 遞迴

2021-10-06 05:25:03 字數 2322 閱讀 4304

今天看了演算法**第三章遞迴 寫一下收貨 省著以後忘

遞迴就是不斷的呼叫自己

如果使用迴圈,程式效率會更高,如果使用遞迴,程式可能更容易被理解

遞迴的基線條件和遞迴條件

1.遞迴條件:自己呼叫自己

2.基線條件:如何讓自己停下來

push(eitem):元素入棧

// push方法 元素入棧

public

epush

(e item)

public synchronized void

addelement

(e obj)

pop():取出棧頂元素,並且將其從棧中移除

public synchronized e

pop(

)

peek():取出棧頂元素,但是不從棧中移除元素

public synchronized e

peek()

empty():判斷棧是否為空,為空返回true,否則返回false

public boolean empty()

search(objecto):在棧中查詢元素位置,位置從棧頂開始往下算,棧頂為1,

public synchronized int search

(object o)

return-1

;}// 底層用的迴圈 寫的真美

public synchronized int lastindexof

(object o, int index)

else

return-1

;}

棧:先進後出 ,計算機內部是如何使用呼叫棧的

public

static

void

main

(string[

] args)

1、int i=1;分兩步:第一步,運算元棧中放1,第二步賦值操作,把運算元棧中的1賦值給區域性變數表中的位置1的變數i,同時運算元棧中的1消除

2、i++;也分兩步,第一步,先把區域性變數表中i的值取出放入運算元棧中的棧頂,第二步,把區域性變數表中的i為1的值自增1,變成2,這需要記住。也就是自增、自減操作都是直接修改變數的值,不經過運算元棧。

所以 i = i++ 後 i的值還是1 同理 j 也是 1

3、這裡我簡化了 因為j=i++的時候 區域性變數表裡的情況為 j = 1; i = 2

4、k的計算 i = 2 ,2壓棧 ,++i ,區域性變數自增後壓棧 區域性變數表 i = 3,棧為 2,3 , 在計算 i++,區域性變數表自增,3 壓入棧,區域性變數裡現在為 j = 1,i = 4 , 棧中 2,3,3現在計算k = 2 + 3*3 = 11

思考的問題:

自己手動實現乙個棧1

自己手動實現乙個棧2

棧資料結構能做什麼

1.遞迴寫錯了會造成棧記憶體溢位

2.如果效率低 考慮尾部遞迴

正常的遞迴

public

static int recursive

(int n)

recursive(5)}}}

}}}}}}}}}

120尾部遞迴

public

static int tailrescuvie

(int n, int a)

public

static int tailrescuvie

(int n)

tailrescuvie(5)

tailrescuvie(5, 1)

tailrescuvie(4, 5)

tailrescuvie(3, 20)

tailrescuvie(2, 60)

tailrescuvie(1, 120)

很容易看出, 普通的線性遞迴比尾遞迴更加消耗資源, 在實現上說, 每次重複的過程

呼叫都使得呼叫鏈條不斷加長. 系統不得不使用棧進行資料儲存和恢復.而尾遞迴就

不存在這樣的問題, 因為他的狀態完全由n和a儲存

原理:當編譯器檢測到乙個函式呼叫是尾遞迴的時候,它就覆蓋當前的活動記錄而不是在棧中去建立乙個新的。編譯器可以做到這點,因為遞迴呼叫是當前活躍期內最後一條待執行的語句,於是當這個呼叫返回時棧幀中並沒有其他事情可做,因此也就沒有儲存棧幀的必要了。通過覆蓋當前的棧幀而不是在其之上重新新增乙個,這樣所使用的棧空間就大大縮減了,這使得實際的執行效率會變得更高。

第三章 遞迴

遞迴是一種強大的方法,它允許乙個物件以其自身更小的形式來定義自己。恐怕沒有什麼比觀察神秘的自然界中出現的遞迴現象更好的方法來體會遞迴的重要意義了。想想蕨類植物的葉子,每片葉子的小枝幹都是整片葉子的較小縮影 又或者兩個反光的物體,相互對映對方的漸遠的影像。這樣的例子使我們明白儘管大自然的力量是強大的,...

第三章 遞迴與分治策略

程式直接或間接呼叫自身的程式設計技巧稱為遞迴演算法。它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的 量。遞迴演算法解題的執行效率較低。在遞迴呼叫過程中,系統為每一層的返回點 區域性變數等開闢...

第三章 堆疊

1.基礎知識 堆疊可以實現很多的應用,遞迴的問題轉化成非遞迴形式,在本質上也是堆疊的問題.它是一種 filo 操作的資料結構,一般也有兩種儲存方式 陣列跟鍊錶實現形式,這裡我給出了鍊錶形式的堆疊模板,裡面包括了基本的堆疊所有的操作,還有兩個比較著名的應用例子,時間倉促,精力比較有限,關於迷宮老鼠還沒...