1. 程式人生 > 其它 >遞迴函式、演算法、生成器

遞迴函式、演算法、生成器

目錄

遞迴函式、演算法、生成器

遞迴函式

 #   遞迴 :在函式執行過程中 直接或者間接的呼叫了自身
    
    
官方表示:python預設最大遞迴深度為1000次
import sys
print(sys.getrecursionlimit())  # 檢視遞迴深度
print(sys.setrecursionlimit(2000))  # 設定遞迴深度


def func():
    print('from func')
    index()
def index():
    print('from index')
    func()
index()


'''
遞迴
   1.遞推
   			一層層往下推到答案(每次遞推之後複雜度相較於上一次一定要有所下降)
   			
   2.回溯
   			依據最後的結論往後推匯出最初需要的答案
   			
   故:遞迴一定要有結束條件!

'''

eg: 第一個人員年齡不確定往後人員比前一個人員大2歲 最後一名人員18歲  計算出最初人員的年齡 

def get_age(n):   
    if n == 1:   
        return 18
    return get_age(n - 1) + 2  
print(get_age(5))  

邏輯:
# age(5) = age(4) + 2
# age(4) = age(3) + 2
# age(3) = age(2) + 2
# age(2) = age(1) + 2
# age(1) = 18


eg2:
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,]]]]]]]]]]]]]]
# 打印出列表中每一個元素(列表除外)
# 1.迴圈該列表 獲取列表內每一個元素
# 2.判斷該元素是否是數字 如果是數字 則直接列印
# 3.如果是列表 則迴圈該列表 獲取列表內每一個元素
# 4.判斷該元素是否是數字 如果是數字 則直接列印
# 5.如果是列表 則迴圈該列表 獲取列表內每一個元素
# 6.判斷該元素是否是數字 如果是數字 則直接列印
# 7.如果是列表 則迴圈該列表 獲取列表內每一個元素
def get_num(lis):
    for i in lis:
        if type(i) is int:
            print(i)
        else:
            # 也是for迴圈 然後判斷
            get_num(i)
get_num(l)

 #  迴圈到空列表後 迴圈自動停止不列印任何東西 所以不需要停止 

演算法

什麼是演算法:
	解決問題的高效方法

演算法之二分法

# 二分法為最入門級別的算髮

# 二分法使用場景:資料必須為有序的
l = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111]

def my_par(get,lis):
    if len(lis) == 0:
        print('對不起無法找到')
        return
    # 先獲取中間位置的索引值
    mid = len(lis) // 2
    # 判斷中間索引對應的值比目標值大還是小
    if get > lis[mid]:
        # 說明要找的元素只可能出現在列表的右側
        l_right = lis[mid + 1:]  # lis(中間位置索引值 : )
        print(l_right)
        my_par(get,l_right)

   
 elif get < lis[mid]:
        # 說明要找的元素只可能出現在列表的左側
        l_left = lis[:mid]
        print(l_left)
        my_par(get,l_left)
    else:
        print('找到了%s'%get)
my_par(222,l)

my_par(222,l)   # 找不到 需要新增結束條件
my_par(11,l)   # 如果要找的元素在開頭 那麼還沒有依次查詢的效率高  

三元表示式

def my_max(a,b):
    if a > b
    	return a
    else:
        return b
# 如果功能需求僅僅是二選一的情況下 那麼推薦使用三元表示式

def my_max(a, b):
    return a if a>b else b

# 格式:條件成立則採用if前面的值 if  條件   else   條件不成立採用else後面的值
#  三元表示式儘可能不要巢狀使用


res =   '對了' if  1 > 2 else '錯了'
print(res)
res = '對了' if 1 > 2 else ('又對了'  if 2 > 1 else '又錯了')
print(res)


eg:
is_free = input('電影是否收費(y/n)>>>>').strip()
if is_free == 'y':
    print('收費')
else:
    print('免費')

三元表示式:
print('收費' if  is_free == 'y' else '免費')

列表生成式

name_list = ['jason', 'kevin', 'tony', 'jerry']
# 實現給列表中每一個元素增加_ddd字尾
'''傳統方式'''
1. 定義一個空列表
new_list = []
# for迴圈舊列表
for i in name_list:
    new_name = '%s_ddd'%i
    new_list.append(new_name)
print(new_list)

'''列表生成器方法'''

res = ['%s_ddd'% name  for name in name_list]
print(res)

字典生成式

# 將兩個列表組合成字典的形成表現出來
l1 = ['name', 'age', 'hobby']
l2 = ['jason', 18, 'read']
new_dict = {}
for i in range(len(l1)):
    new_dict[l1[i]] = l2[i]
print(new_dict)

# 把l1列表表現出索引加元素值
count = 0
for i in l1:
    print(count,i)
    count += 1
    

# 列舉
'''
enumerate(l1)
	針對該方法使用for迴圈取值 每次會產生兩個結果
		第一個是從0開始
		第二個是被迴圈物件裡面的元素
	還可以通過start引數控制起始位置
'''
for i, j in enumerate (l1, start=1):
    print(i,j)
    
name_list = ['jason', 'kevin', 'tony', 'jerry']
res = {i: j for i, j in enumerate(name_list) if j != 'jason'}
print(res)  # 如果有if判斷則先判斷 正確才執行for迴圈

# res1 = {i for i,j in enumerate(name_list)}
# print(res1,type(res1))