递归算法
1.有明确的终点,2.有公共数(eg:2^7,(2+n-1)3),3.给出终止递归时的算法。
简单的来说把复杂有累赘的糅合成一个简单算法。
逐级累加的递归
第一个数字为1,求第五个数字等于多少,逐层+2
图解部分
代码演示
def func(a,n,b):
res=a+(n-1)*b
print(res)
return
func(1,5,2)
列表递归
res = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,]]]]]]]]]]]]]]
打印出这个列表内的所有数字
#方法一,传统做法,循环每个元素,打印数字,遇到数字直接打印,如果是列表,则循环该列表,
#获取列表中的每个元素
def get_num(l):
for i in l :
if type(i) is int:
print(i)
else:
get_num(i)
get_num(l)
算法之二分法
什么二分法
不断切分成二分之一,不断靠近目标值,其余舍弃
eg:a = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111]取这一串列表中的数字123
做法解释:将列表a平均切割成2部分,分为左右两部分,取接近123的那一部分,然后在切割一半,循此往复,取出目标值
要求:数据集必须有序
代码实例
a = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111]
# 方法一:依次循环a内的每一个元素,找出目标值123
count=1
while True:
count += 1
for i in a:
if i == 123:
print(i)
break
# 二分法的应用
def test_two(target_num,a):
# 取a的个数的1/2
middle=len(a)//2#考虑到列表中有奇数的长度,所以选择取整
#判断中间索引对应的值比目标值大还是小
if target_num>a[middle]:
a_right=a[middle+1:]
print(a_right)
test_two(target_num, a_right)
elif target_num<a[middle]:
a_left=a[:middle]
print(a_left)
test_two(target_num,a_left)
else:
print('bing',target_num)
test_two(123,a)
三元表达式
作用:当功能需求只需二选一当情况下,推荐使用三元表达式
'''条件成立采用if前面的值,不成立采用else后面的值,不建议嵌套使用'''
res='达成1个小目标'if 19>8 else('继续努力,你会达成的')
列表生成式:
作用:类似于添加功能,将两个列表整合成一个列表
#通过条件判断之后的变量名for变量名in可迭代对象if条件
name_list=['小米','苹果','华为',‘联想’]
leave=['屌丝','懒癌','国产党','要加油啦']
res=[a+b for a in name_list for b in leave]
print(res)
# 方法二res=[a+b for a in name_list for b in leave]
# print(res)
#方法三
for i in range(len(name_list)):
res.append((name_list[i],leave[i]))
print(res)