即函数在调用阶段,直接或间接的又调用自身。
# 查看函数支持的递归上限 import sys print(sys.getrecursionlimit()) # 不是很精确 # 一般返回的是1000 sys.setrecursionlimit(2000) # 如果想要修改递归的上限,可以用这个方法改到2000
函数不应该无限制的递归下去
递归分为两个阶段
1.回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都应该下降
到有一个最终的结束条件
2.递推:一次次往回推导的过程
age(n) = age(n-1) + 2 # n > 1 age(1) = 18 # n = 1 # 递归函数 def age(n): if n == 1: # 必须要有结束条件 return 18 return age(n-1) + 2 res = age(5) print(res) # 26
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: get_num(i) # 这里递归调用自己,就能达到循环的目的 get_num(l)
l = [1,2,4,65,76,123,156,157,235,256,278,301,324,786] target_num = 66 # 这两个是初始的参数 def get_num(l,target_num): print(l) # 有了这句,每次查找,拆分了列表,都会打印一下列表 middle_index = len(l)//2 # 这里的l之后会被l_left或者l_right替代 # 这样,每次的middle_index都是当前列表的中间的那个 if not l: # 这个写法代表判断如果target_num不在列表l里的话 print(‘这个表里没有‘) return # 如果执行到这句,那他的返回值就是None if target_num > l[middle_index]: l_right = l[middle_index+1:] # 这里注意既然target_num比l[middle_index]大了, # 那么,l[middel_index]就可以排除掉了,直接从l[middle_index+1]开始比较 get_num(l_right,target_num) # 这样就是把l_right当做原来的l传进去了。 # 这里就是递归调用 elif target_num < l[middle_index]: l_left = l[:middle_index] get_num(l_left,target_num) else: print(‘find it‘,l[middle_index]) get_num(l,target_num) # 调用这个函数 # 给这个函数传入两个参数,也就是最上面的两个
[1, 2, 4, 65, 76, 123, 156, 157, 235, 256, 278, 301, 324, 786] [1, 2, 4, 65, 76, 123, 156] [76, 123, 156] [76] [] 这个表里没有
[1, 2, 4, 65, 76, 123, 156, 157, 235, 256, 278, 301, 324, 786] [1, 2, 4, 65, 76, 123, 156] [76, 123, 156] [76] find it 76
以上就是二分法的简单应用,二分法可以说是算法里最简单的一种了。
使用恰当的算法,无疑是可以提高工作效率的。
三元表达式的应用场景比如在以下情况:
要输出两个数里比较大的那个,平常我们需要这么写:
def my_max(x,y): if x > y: return x else: return y
但是,如果你使用了三元表达式,就可以精简成这样:
def my_max(x,y): res = x if x > y else y # 如果if后面的条件成立返回if前面的值 否则返回else后面的值 print(res)
三元表达式固定表达式 值1 if 条件 else 值2 条件成立 值1 条件不成立 值2
# 三元表达式的应用场景只推荐只有两种的情况的可能下 is_free = input(‘请输入是否免费(y/n)>>>:‘) is_free = ‘免费‘ if is_free == ‘y‘ else ‘收费‘ print(is_free) username = input(‘username>>>:‘) res = ‘NB‘ if username == ‘jackMa‘ else ‘normal‘ print(res)
7.12 函数递归 二分法 三元表达式 列表/字典/元组生成式 常用的内置函数
原文:https://www.cnblogs.com/PowerTips/p/11178974.html