今日内容概要
- 递归函数
- 算法之二分法
- 三元表达式
- 列表生成式
![请添加图片描述](https://img-blog.csdnimg.cn/2701272e4ccb41ceb1dda98e8e611be9.gif#pic_center)
今日内容详细
一、递归函数
- 函数不仅可以嵌套定义,还可以嵌套调用,即在调用一个函数的过程中,函数内部又调用另一个函数,而函数的递归调用指的是在调用一个函数的过程中又直接或间接地调用该函数本身(每调用一次自身,相当于复制一份该函数,只不过参数有变化,参数的变化,就是重要的结束条件)
- 本质(如上):递归函数也称为函数的递归,函数在运行的过程中直接或间接地调用了自身。
- 特性:
- 必须有一个明确的结束条件;
- 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
- 相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
- 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
- 优点:定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
- 递归练习:
l1 = [1,[2,[3,[4,[5,[6,[7,[8,[9,]]]]]]]]]
'''需求:循环打印出列表中每一个数字'''
"""
完整步骤
1.for循环大列表
2.判断元素是否是数字 如果是则打印
3.如果不是则for循环
4.判断元素是否是数字 如果是则打印
5.如果不是则for循环
6.判断元素是否是数字 如果是则打印
7.如果不是则for循环
ps:重复做一些事情 但是每次都比上一次简单一些 >>>: 递归函数
"""
def get_num(l):
for i in l:
if isinstance(i,int):
print(i)
else:
get_num(i)
get_num(l1)
二、算法之二分法
算法其实就是解决问题的有效方法
eg:比如打开易拉罐的问题
方法1:使用金属撬棍
方法2:直接手扣
方法3:一阳指戳
...
"""
算法比较偏向于学术研究 很枯燥 并且产出很少
甚至只有非常大的互联网公司才会有算法部分
算法工程师薪资待遇很高 但是产出很少
有时候甚至几年都没有任何的成果 有点类似于研究所!!!
"""
二分法是算法里面最入门的一个 主要是感受算法的魅力所在
"""二分法使用有前提: 数据集必须有先后顺序(升序 降序)"""
l1 = [13,21,35,46,52,67,76,87,99,123,213,321,432,564,612]
"""
二分法原理
获取数据集中间的元素 比对大小
如果中间的元素大于目标数据 那么保留数据集的左边一半
如果中间的元素小于目标数据 那么保留数据集的右边一半
然后针对剩下的数据集再二分
如果中间的元素大于目标数据 那么保留数据集的左边一半
如果中间的元素小于目标数据 那么保留数据集的右边一半
...
"""
def get_target(l1,target_num):
if len(l1) == 0:
print('不好意思 真的没有 找不到')
return
middle_index = len(l1) // 2
if target_num > l1[middle_index]:
l1_left = l1[middle_index+1:]
print(l1_left)
get_target(l1_left,target_num)
elif target_num < l1[middle_index]:
l1_right = l1[:middle_index]
print(l1_right)
get_target(l1_right,target_num)
else:
print('找到了',target_num)
get_target(l1,13)
"""
二分法的缺陷
1.如果要找的元素就在数据集的开头 二分更加复杂
2.数据集必须有顺序
目前没有最完美的算法 都有相应的限制条件
"""
"""
以后面试的时候 可能会让你手用python写一些算法
二分法 快排 插入 冒泡 堆排序
上述知识面试之前临时抱佛脚即可 平时无需过多研究
"""
![请添加图片描述](https://img-blog.csdnimg.cn/ba09f9a7d7c74133bb51c0060f64007c.gif#pic_center)