python程式設計 005遞迴及DP

2021-09-07 18:56:21 字數 1421 閱讀 4339

一、遞迴和dp

1)遞迴

一般情況下,遞迴定義包含兩部分,其中至少有一種基本情況可以直接得到在特定情況下的結果,還有一種遞迴或者歸納情形定義出在其他情況下的結果。

舉乙個簡單的階乘例子:

1!=1

(n+1)!=(n+1)*n!

第乙個式子定義了基本情況,第二個式子定義了其餘情況

那麼我們下面用兩段**來比較一下迭代和遞迴

#迭代

def fact1(n):

result=1

while n>1:

result *=n

n -=1

return result

#遞迴def fact2(n):

if n==1:

return n

else:

return n*fact2(n-1)

2)動態規劃(dp)

動態規劃(dynamic programming)是運籌學的乙個分支,是求解決策過程(decision process)最優化的數學方法。適用於解決具有重複子問題和最優子結構的問題

。如果乙個問題的全域性最優解可以通過組合區域性最優解求出那麼這樣的問題就存在最優子結構。例如歸併排序,先對子列表進行排序,然後合併子列表的排序結果。

動態規劃的核心思想是備忘錄法,將遞迴中的呼叫結果儲存下來,在需要時直接查詢,而不是重新計算,這樣就節省了大量的時間。

這裡我們以乙個斐波那契數列為例來簡單對比一下。

#遞迴

def fib(n):

if n==0 or n==1:

return 1

else:

return fib(n-1)+fib(n-2)

#基於備忘錄法

def fastfib(n,memo={}):

if n==0 or n==1:

return 1

try:

return memo[n]

except keyerror:

result=fastfib(n-1,memo)+fastfib(n-2,memo)

memo[n]=result

return result

我們在這裡做一點簡單的對比分析,遞迴法de複雜度和函式結果成正比,而斐波那契數列增長很快,複雜度大概是o(fib(n)),我們可以大概看一下後面增長速度,fib(1)=1;fib(2)=2;fib(3)=3;fib(b)=5;fib(120)=8e24;

現在來看目錄法,對於0——n的沒乙個整數,他都只計算一次值。因此基於字典查詢可以在常熟時間內完成。fastfib(n)複雜度為o(n)

python基礎程式設計 遞迴

遞迴的通俗理解 遞迴就是在函式內部呼叫自己的函式被稱之為遞迴 def recursion n v n 2 地板除,保留整數 print v 每次求商,輸出商的值 if v 0 當商為0時,停止,返回done return done v recursion v 遞迴呼叫,函式內自己呼叫自己 recur...

函式遞迴及面向過程程式設計

遞迴就是函式呼叫函式本身,然後有結束條件。一般解決無法求解但不斷靠近的值,比如利用二分法找具體的數字,漢諾塔等 讓我們舉個栗子,比如要實現0 99的和,用while迴圈為 num 0 count 0 while count 100 print count count 1 num count prin...

python程式設計300例之 005二分查詢

1 binarysearch2 給定乙個排序的整數陣列 公升序 和乙個要查詢的目標整數target3 查詢到target第一次出現的的下標 從0開始 如果陣列中沒有就返回 1 4 5輸入陣列 1,4,4,5,7,7,8,9,9,10 和目標整數1,輸出其所在的位置為0,即第一次出現第0個位置.輸入陣...