函数的递归

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
当初始值不存在时,先获取取两个元素相加值,之后每次获取一个与上一次相加的结果相加

 

 

 

 

 

posted @ 2019-07-14 22:09  kuanglinfeng  阅读(1772)  评论(0编辑  收藏  举报