递归函数
来源:互联网 发布:双色球随机选号软件 编辑:程序博客网 时间:2024/06/06 01:19
递归调用
在调用一个函数的过程中,直接或间接调用了该函数本身。
1. 直接调用的栗子:
def foo(): print('hello, python') foo()foo() # 执行foo函数,直接调用本身,并且无无限递归下去,直接报错
- 间接调用的栗子:
def fxx(): print('from xx') foo()def foo(): print('from oo') fxx()foo() # # 执行foo函数,调用fxx,fxx调用foo,并且无无限递归下去,直接报错
查看递归设置
import sysprint(sys.getrecursionlimit()) # 1000 => python3 中默认最大递归次数sys.setrecursionlimit() # 设置递归次数
递归的特点
- 递归必须有一个明确的结束条件,比如
if ...: return
l=[1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]]# 取出数列的所有值def show(l): for i in l: if isinstance(i, list): # 结束条件:是列表就继续,如果不是列表,就执行下面的打印 show(i) else: print(i)show(l)
# 问一个人的年龄,这个人比下一个人大两岁,下一个人比下下一个人大两岁......直到第五个人说他18岁def age(n): if n == 1: # 明确的结束条件 return 10 else: return age(n-1)+2print(age(5))
def foo(n): if n == 1: # 设置明确的结束条件。 return print('from oo',n) foo(n-1)
- 递归的两个阶段:
- 递推:到某个阶段,该阶段返回一个值
- 回溯:从那个阶段回溯
- 没进入更深一次递归时,问题规模减少。
- 递归效率不高。
- 应用场景:知道结束的条件,但不确定循环次数。
递归与二分法
# 递归与二分法(每次问题规模缩小一半)data = []for i in range(35): data.append(i)# 定义一个函数,输入一个数字,判断是不是在这个有序数列里面。# 如果挨个找,可能把数列遍历完,效率低。def search(num, data): print(data) if len(data) > 1: # 防止只有一个元素时还未找到,继续二分将对这个元素进行无尽的循环。 mid_index = int(len(data)/2) mid_value = data[mid_index] if num > mid_value: data = data[mid_index:] search(num, data) elif num < mid_value: data = data[:mid_index] search(num, data) else: print('find it') return # 找到了,结束。 else: if data[0] == num: print('find it') else: print('not exist')
阅读全文
0 0
- [递归]递归函数
- 递归函数
- 递归函数
- 递归函数
- 递归函数
- 递归函数
- 递归函数
- 函数递归
- 递归函数
- 递归函数
- 递归函数
- 递归函数
- 函数递归
- 递归函数
- 递归函数
- 递归函数
- 递归函数
- 递归函数
- excel 设置单元格格式为日期格式,数据未发生转换,双击才转换
- Spark原理(一)
- xz压缩文件的解压缩过程
- android 图片旋转实现的两种方法的比较
- windbg常用命令总结
- 递归函数
- Spark Streaming Crash 如何保证Exactly Once
- Android修改整体系统字体大小
- mysql 日志文件mysql-bin文件清除方法
- HTML5上传文件ajaxfileupload.js
- SQLScout插件
- 去除List<String>中的重复元素
- Poj 1679 The Unique MST(次小生成树)
- hibernate bug问题