1. 程式人生 > >函數的遞歸調用與二分法

函數的遞歸調用與二分法

壓力 求職 相加 二分 過程 新的 小數 結束 打印

一,什麽是遞歸?

遞歸的作用可以完全取代循環,很多函數編程語言中習慣用遞歸來實現循環

1,遞歸算法:  (1),‘重復‘ ,凡是通過循環語句可以實現的,都可以用遞歸來實現

        (2),‘將問題分解成同類的子問題‘, 如持續循環的運算操作,持續循環的判斷操作,他們的每次循環都是同樣的一個‘動作‘,這個動作就是一個子問題

2,函數的遞歸調用:

  在調用一個函數的過程又直接或者間接的調用該函數本身,稱之為遞歸調用.

    

  遞歸必須滿足兩個條件:

    1, 每進入下一次遞歸調用,問題的規模都應該有所減少

    2, 遞歸必須有一個明確的結束條件

# 求1,2,3, ...,n加法和(recursion.add.py)
def recursion_sum(num): # 定義遞歸函數 if num == 1: # 分解到最小數1 return num # 返回最小分解數1給上一層 return recursion_sum(num - 1) + num # 自己調用自己,重復動作:兩個相鄰的數相加 print(recursion_sum(666)) # 調用遞歸函數並打印結果

3,遞歸函數在內存中的運行原理

總體實現思想: 遞歸一次,在內存中開辟一個新的地址空間,記錄遞歸過程狀態,一直遞歸分解到最小範圍,最後得出要麽找到對應的值,要麽返回找不到的結果.

遞歸算法其實分為縮小範圍和求職結果的層層返回兩大步驟,類似於數據結構中調用棧(stack)的進棧和出棧操作

4,遞歸函數

  優點: 遞歸的力量顯然在於通過有限陳述來定義無限的對象集合的可能性,即使這個程序沒有明確的重復,也可以用有限遞歸程序來描述無限次的計算.

(不同的查找值查找過程次數不確定,使用遞歸可以靈活的解決)

  缺點: 當所計算的對象數量變得龐大起來時,內存空間壓力就大增,如二分法每遞歸調用一次,需要新開辟一個地址空間,如需要查找的數據集元素達到超級多的時候,很容易是內存空間崩潰.

二分法查找

# 二分法查找,自定義遞歸函數
def r_dichotomy(nums, find, left, right):
    
# 求商的整數,取中間值的索引 middle = (right + left) // 2 # 找到列表中的值 if nums[middle] == find: # 返回找到值對應的索引 return middle # 若指定範圍只有一個未找元素 if right == left + 1: if nums[middle] != find: # 沒有找到元素,返回-1,-1代表沒有找到 return -1 #值的查找範圍在[left,middle)之間,在左邊遞歸查找 if nums[middle] > find: return r_dichotomy(nums,find, left, middle) #值的查找範圍在(middle,right]之間,在右邊遞歸查找 elif nums[middle] < find: return r_dichotomy(nums,find,middle,right) #調用遞歸函數 nums = [3, 5, 7, 11, 13, 23, 24, 76, 103, 111, 201, 202, 250, 303, 341] print(r_dichotomy(nums,999,0,len(nums)))

函數的遞歸調用與二分法