05 3 遞迴與非遞迴 棧的應用 簡單揹包問題

2022-06-26 17:51:12 字數 1958 閱讀 6540

def

fact(n):

if n ==0:

return 1

else

:

return n * fact(n - 1)

if__name__ == '

__main__':

print(fact(3)) #

6

假定需要計算fact(3),其執行中將呼叫fact(2),進而呼叫fact(1)及fact(0)

計算過程中程式執行棧的變化情況,各小圖中標著n一列的格仔表示儲存在棧的函式引數,fact表示呼叫fact的返回值,res表示本次函式呼叫的結果,顯然res應=n*fact

"""n的階乘

"""res = 1st =sstack()

while n >0:

st.push(n)

n -= 1

while

notst.is_empty():

res *=st.pop()

return res

問題描述:乙個揹包可放入重量為weight的物品,現有n件物品的集合s,其中物品的重量分別為w0,w1,w2..wn-1,能否從中選出若干件物品,其重量之和正好等於weight,如果存在就說這一揹包有解,否則就是無解。

def

knap_rec(weight, wlist, n):

"""物品:w0,w1,w2,..,wn-1

knap(weight,n)表示n件物品相對於重量weight的問題,在考慮它是否有解時,通過考慮一件物品的選或者不選,

可以把原問題劃分為兩種情況:

- 如果不選最後一件物品(即重量為wn-1),那麼knap(weight,n-1)的解也是knap(weight,n)的解

- 如果選擇最後一件物品,那麼如果knap(weight-wn-1,n-1)有解,其解加上最後一件的物品就是knap(weight,n)的解,即前者有解後者也有解

:param weight:總重量

:param wlist:各物品重量表

:param n:物品數目

:return:

"""if weight ==0:

return

true

if weight < 0 or (weight > 0 and n < 1):

return

false

#if knap_rec(weight - wlist[n - 1], wlist, n - 1):

#print("item" + str(n) + ":", wlist[n - 1]) # 遞迴最深的位置最先輸出

#return true

#else:

#return knap_rec(weight, wlist, n - 1)

if knap_rec(weight - wlist[n - 1], wlist, n - 1): #

表明選了這件物品

print("

item

" + str(n) + "

:", wlist[n - 1]) #

遞迴最深的位置最先輸出

return

true

return knap_rec(weight, wlist, n - 1) #

沒有選擇這件物品

if__name__ == '

__main__':

wlist = [2, 3, 3, 4, 5]

print(knap_rec(10, wlist, len(wlist)))

#item1: 2

#item3: 3

#item5: 5

#true

棧的應用 遞迴

棧的作用 更加聚焦在需要關注的問題本身,不需要花精力在陣列下標增減等問題 棧的應用 遞迴 遞迴 自己呼叫自己 迭代實現 include intmain return0 斐波拉其數列的遞迴實現 include intfbi int i int main return0 斐波拉其的遞迴函式 intfbi...

遞迴與非遞迴習題

1.遞迴和非遞迴分別實現求第n個斐波那契數。includeint fib int n else 可以跳n節台階 是2 fib n 1 int main includeint fib int n if n 1 n 2 return 1 while a return f3 int main 2.編寫乙個...

遞迴與非遞迴演算法

一 題目分析 將非負十進位制整n轉換成b進製 其中b 2 16 將任意正整數n用2的冪次方表示 二 演算法設計 1 轉換進製問題 exer.cpp 遞迴演算法 遞迴出口 n b b 遞迴表示式 f n,b f n b,b n b b 遞迴棧表示 2 用二的冪次方表示任意正整數n問題 exer2.cp...