天天看點

python中的遞歸算法

遞歸算法:

遞歸算法是一種直接或者間接地調用自身算法的過程。在計算機編寫程式中,遞歸算法對解決一大類問題是十分有效的,它往往使算法的描述簡潔而且易于了解。

遞歸算法解決問題的特點:

(1) 遞歸就是函數在調用階段直接或間接的又調用自身。

(2) 在使用遞歸政策時,必須有一個明确的遞歸結束條件,稱為遞歸出口。

(3) 遞歸算法解題通常顯得很簡潔,但遞歸算法解題的運作效率較低。是以一般不提倡用遞歸算法設計程式。

遞歸分為兩個階段:

(1):回溯:就是一次次重複的過程,這個重複的過程必須建立在每一次重複問題的複雜度都應該下降直到有一個最終的結束條件。

(2):遞推:一次次往回推導的過程。

遞歸函數不要考慮循環的次數 隻需要把握結束的條件即可

1 def recursion(i):   #定義函數
 2     print(i)
 3     if i/2 > 1:   #判斷遞歸條件,退出
 4         re = recursion(i/2)  #遞歸函數自身
 5         print(\'傳回值:\',re)
 6     print(\'上層遞歸值:\',i)
 7     return i     #傳回值
 8 recursion(10)
 9 
10 
11 """
12 運作原理:首先運作函數傳參10給函數,列印10,判斷條件是否滿足,
滿足遞歸函數參數值為(10/2)5,列印i的值5,等遞歸到1.25時,判斷條件不滿足後,
才列印上層遞歸的值,此時的值為1.25,return遞歸最後一層的值1.25,退出最後一層遞歸,
繼續一層層退出遞歸,最後傳回最上層遞歸值結束函數。
13 
14 """
15 
16 # 輸出結果為:
17 10
18 5.0
19 2.5
20 1.25
21 上層遞歸值: 1.25
22 傳回值: 1.25
23 上層遞歸值: 2.5
24 傳回值: 2.5
25 上層遞歸值: 5.0
26 傳回值: 5.0
27 上層遞歸值: 10      

python二分算法:

二分算法是能夠更高效解決問題的方法:

二分查找操作的資料集必須是一個有序的資料集。開始時,先找出有序集合中間的那個元素。如果此元素比要查找的元素大,就接着在較小的一個半區進行查找;反之,如果此元素比要找的元素小,就在較大的一個半區進行查找。在每個更小的資料集中重複這個查找過程,直到找到要查找的元素或者資料集不能再分割。

二分查找能應用于任何類型的資料,隻要能将這些資料按照某種規則進行排序。然而,正因為它依賴于一個有序的集合,這使得它在處理那些頻繁插入和删除操作的資料集時不太高效。這是因為,對于插入和操作來說,為了保證查找過程正常進行,必須保證資料集始終有序。相對于查找來說,維護一個有序資料集的代價更高。此外,元素必須存儲在連續的空間中。是以,當待搜尋的集合是相對靜态的資料集時,此時使用二分查找是最好的選擇。

二分算法實質上是不斷地将有序資料集進行對半分割,并檢查每個分區的中間元素。

# 二分法查找要求:查找序列必須是有序序列
# 查找156在lst中的位置
lst = [1, 4, 5, 6, 8, 9, 11, 15, 17, 18, 19, 45, 49, 98, 101, 156, 178, 199]
def binary_search(lst, n, left, right):
    if left > right:
        print("沒有這個數")
        return -1
    middle = (left + right) // 2
    if n < lst[middle]:
        right = middle - 1
    elif n > lst[middle]:
        left = middle + 1
    else:
        return middle
    return binary_search(lst, n, left, right)
left = 0
right = len(lst) - 1
print(binary_search(lst, 156, left, right))  # 15 查找的156在清單的第15位。      

python三元表達式:

使用一行代碼快速判斷,替換複雜的多行if語句,使得代碼簡單可維護。

"""
三元表達式固定表達式
    值1 if 條件 else 值2
        條件成立 值1
        條件不成立 值2
"""

# 普通模式判斷大小:
x=2
y=3
if x > y:
    print(x)
else:
    print(y)

# 三元表達式比大小
x = 2
y = 3
res = x if x > y else y    
print(res)      

python清單生成式:

清單生成式是Python内置的非常簡單卻強大的可以用來建立list的生成式。清單生成式的結構是在一個中括号裡包含一個表達式,然後是一個for語句,然後是0個或多個for或者if語句。清單表達式可以是任意的,意思是你可以在清單中放入任意類型的對象。傳回結果将是一個新的清單,在這個以if和for語句為上下文的表達式運作完成之後産生。運用清單生成式,可以快速生成list,可以通過一個list推導出另一個list,而代碼卻十分簡潔。

# 生成[1x1, 2x2, 3x3, ..., 10x10]

# 不用清單生成式:
l = []
for x in range(1, 11):
    l.append(x * x)
print(l)  # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]


# 使用清單生成式:
l = []
res = [x * x for x in range(1, 11)]
print(res)  # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]


"""
先for循環依次取出清單裡面的每一個元素
然後交由if判斷  條件成立才會交給for前面的代碼
如果條件不成立 目前的元素 直接舍棄
"""      

python字典生成式:

# 例:
my_dict = {"a": 1, "b": 2, "c": 3}
print(my_dict)  # {\'a\': 1, \'b\': 2, \'c\': 3}      

匿名函數:

匿名函數有個限制,就是隻能有一個表達式,不用寫

return

,傳回值就是該表達式的結果。用匿名函數有個好處,因為函數沒有名字,不必擔心函數名沖突。此外,匿名函數也是一個函數對象,也可以把匿名函數指派給一個變量,再利用變量來調用該函數:有些函數在代碼中隻用一次,而且函數體比較簡單,使用匿名函數可以減少代碼量,匿名函數是沒有名字的函數,它的特點是臨時存,用完就沒了。

#普通函數:
def calc(x,y):
    return x**y
print(calc(x=2,y=5))



# 換成匿名函數
calc = figure x,y:x**y
print(calc(2,5))      

函數的常用的内置方法:簡單的提一下:

abs():

絕對值函數。如abs(-1)= 1

# 參數:
# x -- 數值表達式,可以是整數,浮點數,複數。

# 傳回值:
# 函數傳回 x(數字)的絕對值,如果參數是一個複數,則傳回它的大小。


>>> abs(-10)
10
>>> f = abs
>>> f(-1)
1
>>> abs=id
>>> abs(1)
1869788224

"""
以abs()函數為例,展示兩個特性。一是,内置函數是可以被指派給其他變量的,
同樣也可以将其他對象指派給内置函數,這時就完全變了。是以,内置函數不是
Python關鍵字,要注意對它們的保護,不要使用和内置函數重名的變量名,這
會讓代碼混亂,容易發生難以排查的錯誤。
"""