函數的遞歸


1.函數的遞歸

  指一個函數在內部調用的階段直接或者間接的調用了自身並且,return語句不能包含表達式。

遞歸分為兩個階段
  1.回溯:就是一次次重復的過程,這個重復的過程必須建立在每一次重復問題的復雜度都應該下降
直到有一個最終的結束條件
  2.遞推:一次次往回推導的過程

'''
age(4)=age(3)+1
age(3)=age(2)+1
age(2)=age(1)+1
age(1)=1
可找出規律:
age(n)=age(n-1)+1   n>1時成立 
age(1)=1
'''
#遞歸函數
del age(n):
    if n == 1    #必須要有結束條件4
        return 1
    return age(n-1)+1
res = age(4)
print(res)  #遞歸函數不要考慮循環的次數 只需要把握結束的條件
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]],將列表中的數字依次打印出來
def num(l):
    for i in l:
        if type(l) is int:
            print(i)
        else:
             num(i)    
num(l)    #用for循壞來打印的話,代碼就比較繁瑣
# 遞歸函數的優點是定義簡單,邏輯清晰。理論上,所有的遞歸函數都可以寫成循環的方式,但循環的邏輯不如遞歸清晰,代碼也不如遞歸的可讀性高。

頂替方法:①第一種是pass,②第二種是...。推薦使用第一種。

2.算法之二分法

  前提:容器里面的數組一定要是有順序的。

  基本思想:假設數據是按升序排序的,對於給定值x,從序列的中間位置開始比較,如果當前位置值等於x,則查找成功;若x小於當前位置值,則在數列的前半段中查找;若x大於當前位置值則在數列的后半段中繼續查找,直到找到為止。

l = [1,3,5,12,57,89,101,123,146,167,179,189,345]
target_num = 666        #target_num 目標編號
def get_num(1,target_num):
    if not =1:
        print('該數字不存在!')
        return
    print(l)  
    middle_number = len(l)//2      #中間索引
    if target_num > l[middle_index]    # 切取列表右半部分
        num_right = l[middle_index + 1:]    # 再遞歸調用get_num函數
        get_num(num_right,target_num)
    elif target_num < l[middle_index]:    # 切取列表左半部分
          num_left = l[0:middle_index]  # 再遞歸調用get_num函數
          get_num(num_left, target_num)
    else:
        print('find it',target_num)
get_num(l,target_num)

3.三元表達式

比較x和y的大小。
#用函數來表示
def my_max(x,y)
    if x > y:
        return:x
    else:
        return:y
#當某個條件成立時做一件事,不成立時做例外一件事。
#比如當x大的時候返回x,當y大的時候返回y。

#用三元表達式來表達
res = x   if x > y else  y     #如果if后面的條件成立返回if前面的值 否則返回else后面的值
三元表達式固定表達式
   值1  if  條件  else 值2
        條件成立 :   值1
        條件不成立: 值2

補充:三元表達式的應用場景只推薦只有兩種選擇的情況下使用。

4.列表生成式

#往列表里面的內容增加一個尾注
#for循環添加方法
l=['1','2','3','4','5','6']
li=[]
for name in l:
    li.append('%s_nb'%name)
print(li)
# 列表生成式
res = ['%s_nb'%i for i in l]
print(res)
l = ['1_nb', '2_nb', '3_nb', '4_nb','6_dnb'],將含有‘_nb’的另外組成一個列表。
res=[name for name in l if name.endswith('_nb')] #后面不支持else,因為else可以與for,if都有關聯。
print(res)     #['1_nb', '2_nb', '3_nb', '4_nb', '5_nb']
# 先for循環依次取出列表里面的每一個元素
# 然后交由if判斷  條件成立才會交給for前面的代碼
# 如果條件不成立 當前的元素 直接舍棄

5.字典生成式

跟列表生成式一樣,字典生成式用來快速生成字典,不同的是,字典需要兩個值。

#d = {key: value for (key, value) in iterable}
d1 = {'x': 1, 'y': 2, 'z': 3}
d2 = {k: v for (k, v) in d1.items()}
print(d2)

6.匿名函數

特點:一般都是臨時存在,用完就沒了。 

def my_sum(x,y)
    return x + y
lambad x,y : x+y
# 注:其中左邊的相當於函數的形參,右邊的相當於函數的返回值。
# 匿名函數通常不會單獨使用,是配合內置函數一起使用,也可以配合自己寫的函數一起使用

 7.內置函數

# map 映射   一一對應
l = [1,2,3,4,5,6]
print(list(map(lambda x:x+1,l)))  # 基於for循環
>>>:[6, 7, 8, 9, 10, 11]


# zip 拉鏈  # 基於for循環,只顧及短的那一端
l1 = [1,2,]
l2 = ['a','b','c']
print(list(zip(l1,l2)))
>>>:[(1, 'a'), (2, 'b')]


# filter
l = [1,2,3,4,5,6]
print(list(filter(lambda x:x != 3,l)))     #>>>:[1, 2, 4, 5, 6]
# 基於for循環,依次取出列表中的每一個值,取出來的值都放在lanbda中,其中(lambda)相當於一個條件,如果返回是false,那個值就不要。

# reduce
from functools import reduce
l = [1,2,3,4,5,6]
print(reduce(lambda x,y:x+y,1))    #>>>:21
當初始值不存在時,先獲取取兩個元素相加值,之后每次獲取一個與上一次相加的結果相加

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM