Python資料結構與演算法 棧和遞迴函式

2022-07-19 10:15:13 字數 3244 閱讀 1350

#棧的常用操作

# stack() 建立乙個空的棧物件

# push() 把乙個元素新增到棧的最頂層

# pop() 刪除棧最頂層的元素,並返回這個元素

# peek() 返回最頂層的元素,並不刪除它

# isempty() 判斷棧是否為空

# size() 返回棧中元素的個數

#使用python中的列表進行對棧的實現

class stack():

'''對棧進行模擬'''

def __init__(self):

self.values =

def push(self, value):

def pop(self):

return self.values.pop()

def peek(self):

if not self.isempty():

return self.values[len(self.values)-1]

def isempty(self):

return len(self.values) == 0

def size(self):

return len(self.values)

def print_all(self):

print(self.values)

s= stack()

print(s.isempty()) #true 代表棧為空

s.push(12)

s.push(13)

print(s.isempty()) #false

print(s.peek()) #13

print(s.size()) #2

print(s.pop()) #13

print(s.peek()) #12

s.push('hello')

s.push('this')

s.push('world')

s.print_all() #[12, 'hello', 'this', 'world']

print(s.size())

如果在一種資料結構的某個或某幾個部分具有與整體同樣的結構,稱為遞迴。

階乘遞迴函式實現:

if n == 0:

return 1

else:

return n * fact(n-1)

print(fact(3)) # 6

傳統方法實現遞迴:

result = 1

for i in range(1, n+1):

result *= i

return result

print(fact1(3)) # 6

其他例子:

if n == 1:

return 18

else:

re = age(n-1) + 2

print('遞迴返回的值:%d'%re)

print('遞迴的值:%d'%n)

return re

print(age(5)) # 26

# 遞迴返回的值:20

# 遞迴的值:2

# 遞迴返回的值:22

# 遞迴的值:3

# 遞迴返回的值:24

# 遞迴的值:4

# 遞迴返回的值:26

# 遞迴的值:5

# 26

例子2:

def recursion(n):

print(n)

if n/2 > 1:

re = recursion(n/2) # 此處沒有return語句, 但是遞迴進行回溯的時候,還是會進行該語句,進行列印操作

print('返回值', re)

print('上層遞迴值',n)

return n # 返回函式中的recursion進行遞迴,一步步返回溢位的 n值。棧結構。

print(recursion(10))

# 10

# 5.0

# 2.5

# 1.25

# 上層遞迴值 1.25

# 返回值 1.25

# 上層遞迴值 2.5

# 返回值 2.5

# 上層遞迴值 5.0

# 返回值 5.0

# 上層遞迴值 10

# 10

print('test recursion2 start ----')

def recursion2(n):

print(n)

if n/2 < 1:

re = recursion2(n/2)

print('返回值:',re)

else:

print('上層遞迴值:',n)

return n

recursion2(10)

print('test recursion2 end----')

# test recursion2 start ----

# 10

# 上層遞迴值: 10

# test recursion2 end----

使用遞迴函式解決揹包問題: 從 6個物品中選擇 若干個,使得總重量為weight

if weight == 0:

return true

if weight < 0 or (weight > 0 and n < 1): # weigh小於0了,則無解。weight還有重量,但是沒種類了,也還是無解

return false

if knap_rec(weight - wlist[n-1], wlist, n-1): #如果選擇最後一件物品都有解。則減少重量,也減少種類

print('item ' + str(n) + ':' + str(wlist[n-1]))

return true

if knap_rec(weight, wlist, n-1): #如果不選擇最後一件物品仍然有解。針對同樣重量當物品種類減1的子問題仍有解,則有解

return true

else:

return false

weight = 20

wlist = [2, 8, 10, 12, 15, 6]

n = 6

print(knap_rec(weight, wlist, n))

# item 1:2

# item 4:12

# item 6:6

# true

python資料結構與演算法 棧

逆波蘭表示式 reverse polish notation 有效的運算子包括 每個運算物件可以是整數,也可以是另乙個逆波蘭表示式。輸入 2 1 3 輸出 9 解釋 2 1 3 9 分析 棧 遍歷陣列,逐漸壓入棧中,如果遇到運算字元,則彈出棧頂兩個元素,之後將計算結果再壓入棧中 class solu...

python資料結構與演算法 棧

棧 stack 建立乙個新的空棧 push item 新增乙個新的元素item到棧頂 pop 彈出棧頂元素 peek 返回棧頂元素 is empty 判斷棧是否為空 size 返回棧的元素個數 stack 建立乙個新的空棧 push item 新增乙個新的元素item到棧頂 pop 彈出棧頂元素 p...

資料結構與演算法《棧》

概念 棧 stack 又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧 入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素 從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使...