Python筆記(五) 變數 遞迴與高階函式

2021-08-20 03:07:24 字數 3075 閱讀 2280

區域性變數與全域性變數

高階函式

遞迴:在函式內部,可以呼叫其他函式。

如果函式在內部呼叫自身本身,則這個函式就是遞迴函式;

遞迴特性

-1、必須有明確結束條件

-2、最大遞迴999層

-3、每次進入更深遞迴時,問題規模應比上次遞迴少

-4、遞迴效率不高,遞迴層次過多會導致棧溢位

#遞迴

defcalc

(n)print

(n)return

calc

(n+1)

calc

(0)························

#通過遞迴,使乙個數一直除以2,直到不能除為止

defcalc

(n)print

(n)if

int(n/2) > 0:

return calc(int(n/2))

print("---->",n)

>> 10

>> 5

>> 2

>> 1

>> ----> 1

遞迴可以解決很多演算法問題,把複雜問題分成小問題;如階乘和二分查詢;

任何大於1的自然數 n 階乘表示方法 n

!=1×

2×3×

...×

n n!=

1×2×

3×..

n或 n

!=n×

(n−1

)!n !=

n×(n

−1)!

使用遞迴**來實現:

# 4! = 4×3×2×1 = 24

deffactorial

(n):

if n == 0: #是0的時候,就算完了

return

1return n*factorial(n-1) #每次遞迴相乘,n值都較之前小1

d = factorial(4)

print(d)

>> 24

當猜乙個取值範圍在 [0,100] 的數,每次猜測都會告訴高了或是低了,用最少的次數猜出該數,則可以每次將取值區間一分為二,直到猜對。

那麼,我們假定在乙個已排序的陣列data中,使用二分法查詢 n

陣列範圍是 [low,… ,high],n 就在該範圍內

查詢的方法是拿low到high的正中間的值,假設是 mid ,來和n相比

如果mid > n ,則n在陣列前半部分

否則在後半部分

然後再次折半查詢,重複過程,直到找到n位置

**實現:

data = list(range(101))

defb_search

(n,low,high,d):

#要找的值n \取值範圍[0-101] \列表data

mid = int((low + high)/2)

if low == high:

print("not found")

if d[mid] > n:

print("go left:",low,high,d[mid])

b_search(n,low,mid,d)

elif d[mid] < n:

print("go right",low ,high,d[mid])

b_search(n,mid+1,high,d)

else:

print("find it",d[mid])

b_search(56,0,len(data),data)

>> go right 0

10150

go left: 51

10176

go left: 51

7663

go left: 51

6357

go right 51

5754

find it 56

整個運算過程求了 lo

g2100≈

7 log

2100≈7

次。

1、如果乙個函式中所有遞

歸形式的呼叫都出現在函式的末尾,我們稱這個遞迴函式是尾遞迴的。

2、當遞迴呼叫是整個函式體中最後執行的語句且它的返回值不屬於表示式的一部分時,這個遞迴呼叫就是尾遞迴。

3、尾遞迴函式的特點是在回歸過程中不用做任何操作

例如:

def

calc

(n):

print(n - 1)

if n > -50:

return calc(n-1)

上面的階乘不是尾遞迴,因為遞迴計算最終的return操作是乘法操作。

每個活躍期的返回值都依賴於用n乘以下乙個活躍期的返回值,因此每次呼叫產生的棧幀將不得不儲存在棧上直到下乙個子呼叫的返回值確定。

注:不要在函式內修改全域性變數;

更不要在函式內定義全域性變數!!!

當全域性變數與區域性變數重名時,子程式內區域性變數起作用,其他地方全域性變數起作用

乙個函式可以接受另乙個函式作為變數,則該函式稱為高階函式

def

add(a,b,f):

return f(a)+f(b)

res = add(3,-6,abs) # abs(-5) = 5

print(res)

>> 9

五 Python 全域性與區域性變數 函式遞迴

11.變數 全域性變數 沒有縮排的變數稱為全域性變數 name tom print name def test print name test 區域性變數 在函式內部定義帶有縮排的變數稱為區域性變數 全域性作用域與區域性作用域 函式外部的區域稱為全域性作用域 函式內部的區域稱為區域性作用域 函式內部...

Python筆記(五) 變數型別之列表

序列是python中最基本的資料結構。序列中的每個元素都分配乙個數字 它的位置,或索引,第乙個索引是0,第二個索引是1,依此類推。python有6個序列的內建型別,但最常見的是列表和元組。序列都可以進行的操作包括索引,切片,加,乘,檢查成員。此外,python已經內建確定序列的長度以及確定最大和最小...

變數與遞迴函式(第五天)

2019 01 09 經過了十天左右的休息,重新開始學習玩蛇 當區域性變數與全域性變數同名時,在定義區域性變數的子程式內,區域性變數起作用,在其他地方全域性變數起作用。global可以 在函式中獲取全域性變數,變數本質上就是全域性變數,可讀取可賦值 如果函式的內容無global關鍵字,優先讀取全域性...