函数(三)

函数递归

1.什么是函数递归。

函数在调用阶段直接或间接的又调用自身

2.怎么用递归

例子:

直接递归:

def func(n):
    print('from func',n)
    func(n+1)
func(1)

补充:

import sys
sys.setrecursionlimit(2000)#能够让递归深度变得更大

递归深度一般为 997 或者 998 之间  

间接递归:

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

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

login()

函数递归,跟使用for 循环 ,while 循环有些形式上差不多,但是递归能做一些循环语句做不了的事情

有一个重要的一点:函数递归,每次调用自身都会在内存空间开辟出一个额外的内存空间,因此当函数无限制的递归下去,就会非常的浪费内存。而for,while循环时,他们的无限循环仅仅在自身开辟出的空间里执行,不会浪费非常多的空间。因此函数递归就会有递归深度限制出现,防止内存爆炸。

 

递归分为两个阶段

  1.回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都应该下降,直到有一个最终的结束条件

  2.递推:一次次往回推到的过程

下面举两个具体的例子:

一:知道第一个人的年龄为18,每一个人是比前一个人年龄大两岁,用递归写出第五个人的年龄:

def age(n)
    if n == 1:  #必须要有结束条件
        return 18
    return age(n-1) + 2
res = age(5)
print(res)

二:l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]]

将列表中的数字依次打印出来(循环的层数是你必须要考虑的点)

def get_num(l):
    for i in l:
        if type(i) is int :
            print(i)
        else:
            return get_num(i)

get_num(l)
def fun(l):
    print(l[0])
    if len(l) > 1:
        fun(l[1]

算法之二分法

现在有一个列表 l = [1,3,5,12,57,89,101,123,146,167,179,189,345]  

我想找出其中有没有189这个数,我们会怎么做。

1.循环判断

for i in l:
    if i == 189:
        print('find it')

那么如果这个列表特别长,而且我要判断的数在最后面,那我们是不是要把这个列表所有数都要遍历一遍这样太浪费时间了。那么为了节省时间我们就可以用二分查找算法来做。

首先:二分查找算法有个特定的要求 , 查找的内容必须是有顺序的

target_num = 189
def get_num(l,target_num):
    if not l:
        print('没找到')
        return
    # 获取列表中间的索引
    print(l)
    middle_index = len(l) // 2
    # 判断target_num跟middle_index对应的数字的大小
    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)

三元表达式

三元表达式固定的表达式格式

  值1  if条件 else 值2

    条件成立  值1

    条件不成立   值2

1.普通写法:

def my_max(x,y):
    if x > y:
        return x
    else:
        return y

2.三元表达式写法:

res = x if x > y else y

三元表达式的应用场景只推荐只有两种的情况的可能下

列表生成式

现在有一个列表 l =['tank','nick','oscar','sean'] 在列表中每个元素的后面加上_sb

l1 = []
for name in l:
    l1.append('%s_sb'5name)
print(l1)

列表生成式的写法:

res = ['%s_sb'%name for name in l]
print(res)

若现在有列表l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb','jason_NB'],取出元素后有_sb的元素

res = [name for name in l if name.endswith('_sb')]

字典生成式

l1 = ['name','password','hobby']
l2 = ['jason','123','DBJ']

dic = {l1[i]:l2[i] for i in range(len(l1))}
print(dic)

#{'name': 'jason', 'password': '123', 'hobby': 'DBJ'}

匿名函数

见名思意就是没有名字的函数,其特点:l临时存在用完就没了

def my_sum(x,y):
    return x+y

#匿名函数写法
res = (lambda x,y:x+y)

匿名函数中  :左边的相当于函数的形参

      :右边的相当于函数的返回值

匿名函数通常不会单独使用,是配合内置函数一起使用

 

posted @ 2019-07-12 15:24  s686编程传  阅读(136)  评论(0编辑  收藏  举报