從兩個示例說明學習迭代方式 遞迴

2021-10-19 16:10:00 字數 1994 閱讀 3977

目錄

一、什麼是遞迴

二、階乘函式

1、階乘函式

2、遞迴實現

3、演算法分析

三、二分查詢

1、二分查詢

2、遞迴實現二分查詢演算法

3、演算法分析

電腦程式中,迭代通常使用迴圈描述,耳熟能詳的莫過於for和while迴圈。另一種完全不同的迭代實現方式就是遞迴。

遞迴是一種技術,通過乙個函式在執行過程中一次或多次呼叫其本身,直至呼叫執行完成。下邊將從兩個例子說明遞迴:1、利用遞迴使用階乘函式;2、使用遞迴實現二分查詢演算法。

階乘函式數學定義:

乙個正整數n的階乘表示為n!,它被定義為從1到n的整數的乘積,如果n=0,則規定n!=1。更為正式的定義為:對於任何整數

通常,對於乙個正整數n,可定義

**段:

def factorial(n):

if n==0:

return 1

else:

return n*factorial(n-1)

if __name__ == "__main__":

n = 4

c = factorial(n)

print(c)

如上函式沒有任何顯式的迴圈。迭代通過函式的重複遞迴呼叫實現。當函式每被呼叫一次,其引數n就變小一次,當n==0時,返回1,遞迴呼叫也就停止。

如下圖,n=4時候的階乘計算過程:

為計算factorial(n) 共執行了n+1次函式呼叫,引數從第一次呼叫時的n下降到第二次呼叫的n-1,直至呼叫到n=0時,操作的總次數為o(n),每次呼叫佔的操作次數為o(1)。

該演算法用於在乙個含有n個元素的有序序列中快速定位目標值。這是最重要的計算機演算法之一,也是我們經常順序儲存資料的原因。

當序列無序時,尋找乙個目標值的標準方式是使用迴圈來檢查每乙個元素,直至找到目標值或檢查完資料集中的每個元素。這就是所謂的順序查詢演算法。因為最壞的情況下每個元素都需要檢查,這個演算法的時間複雜度是o(n)(即線性的時間)。

當序列有序並且可以通過索引訪問時,有乙個更有效的演算法,即二分查詢。對於任意的索引j,在索引0,……,j-1上儲存的所有值都小於索引j的值,並且在索引j+1,……,n-1上儲存的所有值大於或等於索引j上的值。在搜尋目標值時,這種觀察能使我們迅速找到目標值,該演算法維持 兩個引數low和high,這樣可使所有的候選條目的索引位於low和high之間,首先,low=0和high=n-1。然後 比較目標值和中間值,即索引mid的資料。

**段(python3)

def binary_search(data,target,low,high):

if low>high:

return false

else:

mid = (low+high)//2

if target == data[mid]:

return true

elif target < data[mid]:

high = mid-1

return binary_search(data,target,low,high)

else:

low = mid+1

return binary_search(data,target,low,high)

查詢過程**:

一次二分查詢中,資料條目為n,進行第一次二分查詢呼叫後,資料條目至多為n/2,進行第二次呼叫後,至多為n/4,以此類推。一般情況下,對於n個資料,進行j次二分查詢呼叫後,剩餘的資料 數量至多為

兩個lock的經典使用示例

示例一 public class numberprintdemo catch interruptedexception e 當state 1時,輪到執行緒1列印5次數字 for int j 0 j 5 j system.out.println 執行緒1列印完成後,將state賦值為2,表示接下來將輪...

「從交換兩個值」談起

交換兩個值,這是任何一門語言書籍都會談起的,今天我們還 這個看似簡單,實則有點意思問題。我們用c 的語法來講解,其他語言都可以共通!我們假設有兩個整形變數,定義如下 int ntemp1 23,ntemp2 39 第一種方式 借用 int ntemp ntemp1 ntemp1 ntemp2 nte...

vmware 兩個虛擬網絡卡的說明

安裝完虛擬機器之後在 網路上的芳鄰 中會多出2個網絡卡,分別是 vmware network adapter vmnet1 和 vmware network adapter vmnet8 這兩個網絡卡是vmware 模擬出來的,相當於是本機多了兩個物理網絡卡,外加上本地網絡卡,總共是三個網絡卡,這三...