目錄
一、什麼是遞迴
二、階乘函式
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 模擬出來的,相當於是本機多了兩個物理網絡卡,外加上本地網絡卡,總共是三個網絡卡,這三...