def假定需要計算fact(3),其執行中將呼叫fact(2),進而呼叫fact(1)及fact(0)fact(n):
if n ==0:
return 1
else
:
return n * fact(n - 1)
if__name__ == '
__main__':
print(fact(3)) #
6
計算過程中程式執行棧的變化情況,各小圖中標著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,如果存在就說這一揹包有解,否則就是無解。
defknap_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...