遞迴及三種二分法

2022-09-11 21:57:28 字數 2294 閱讀 9624

遞迴是指乙個函式在其內部呼叫自身的方法,這個過程可以反覆巢狀多層,

1.官方說法是1000層,實測第997層之後就不再呼叫了,這個層數是可以修改的,但一般不會這麼做.

2.遞迴的出口和結束不一定是return,以遍歷資料夾下的各個檔名為例,print所有檔名即可結束遞迴

3.但是如果需要最後一次遞迴的返回值(比如下面提到的第三種二分法),則需要在每次呼叫的時候都返回該函式

此時return收到的是上一次函式的返回值,層層追回到最後一層得到整個遞迴的最終返回結果,並以這種形式輸出這個值  

函式的return語句只能在呼叫的這一層起作用,不加處理的話,是不會出現在呼叫這個函式所在語句的巢狀層之外的,會使遞迴的列印結果變成none

二分法的機制避免了依次遍歷每乙個元素的低效率操作;而是把每次比較元素的內容都限制在上一次比較涉及範圍的二分之一裡.

顯然,二分法的優點是能夠大大提高尋找的效率、節約空間。

但是,二分法的缺點也是顯而易見的,為了讓演算法內部每一次的分半是有意義的,必須要求在乙個有序的物件中尋找目標元素.

下面從三個不同的思路寫一下二分法的程式

方法一:不使用遞迴

二分法的尋找次數是不能確定的,

這就意味著可以通過設定有條件的while迴圈來滿足持續的尋找需求,for迴圈不行

l = [2, 3,88,100]

def func(lst,n):

left = 0

right = len(lst)-1

while left <= right: #如果一直無法找到,不滿足while條件,即left>right

mid = (left + right)//2 #地板除取整數部分

if n == lst[mid]:

print('在列表內')

print('是列表裡的第%d個數' %(mid+1))

break #找到之後及時退出迴圈

elif n < lst[mid]:

right = mid - 1

else:

left = mid + 1

else:

print('沒找到')

func(l,3)

方法二:使用遞迴,改變left和right的值

l = [2,3,88,100]

def func(left,right,lst,n):

mid = (left + right)//2           #使用遞迴的話,在本演算法中需要在最開始手動輸入左右兩端的數值,作為函式的引數之一,

#如果在函式內部將其分別設定為0和len(l)則無法有效在下一次呼叫時改變left和right的值

#注意,此處沒有將下一層函式的值返回到這一層,因為最終遞迴的出口是一句print()語句,無需返回
#同理,此處也無需返回

if left <= right:

if n == lst[mid]:

print ('在列表內')

return '是列表裡的第%d個數' %(mid+1)

elif n < lst[mid]:

right = mid - 1

return func(left,right,lst,n)

else:

left = mid + 1

return func(left,right,lst,n)

else:

print('沒找到')

return -1

print(func(0 , len(l)-1 , l , 88))

方法三:使用遞迴,改變被查的列表

l = [2,3,88,100]

deffunc(lst,n):

left =0

right =len(lst) #此處不能寫為len(lst)-1,會使最左邊的2找不到,應該的[2]就變成了

#在這個演算法中,取列表的右側是不受影響的,因為此時最右端是自動到全部的最後

#如果想加上'-1',那麼在下面的[:mid-1]去掉'-1'

mid = (left + right)//2 if right<0: return ('沒找到') #此處return修改之後效果同下 else: if n >lst[mid]: lst =lst[mid+1:] print(lst) elif n 
returnfunc(lst, n) 

print(func( l ,100))

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...

遞迴二分法查詢

二分法使用了折半查詢的思想,不斷的變化,陣列下標的起始位置 begin 和終止位置 end 來進行搜尋。我們使用兩種演算法,解決二分查詢 public class solution system.out.println solution.sort number,0,number.length,56 ...

二分法查詢 遞迴

需求 查詢陣列中某個元素的下標 實現方法 二分法查詢 折半查詢,每次把錶分成兩半,因為已經排好序,所以每次只需要和中間的數比較,就能確定要查詢的值在哪一半,然後不斷分成兩半,直到匹配,如果沒有找到,則表示沒有該元素 public static int find int x int min 0 int...