day17.初识递归函数
在一个函数调用这个函数本身就是递归函数
递归函数默认深度最大997
n = 0
def func():
global n
n += 1
print('hello,world')
print(n)
func()
print('你好,中国')
func()
当然,最大深度也是可以调整的,根据计算机性能改变
import sys
sys.setrecursionlimit(100000)
n = 0
def func():
global n
n += 1
print('hello,world')
print(n)
func()
print('你好,中国')
func()
递归实例:
A 比 B大2岁,B 比 C大2岁,C 比 D大2岁,D 比 E大2岁,E今年20岁。
如果你问A的年龄,则由 A 推到 E,再由 E 计算到 A 。得到下面一个小公式
A 比 B 大 2 岁 n = 1 age(1) = age(2) + 2
B 比 C 大 2 岁 n = 2 age(2) = age(3) + 2
C 比 D 大 2 岁 n = 3 age(3) = age(4) + 2
D 比 E 大 2 岁 n = 4 age(4) = age(5) + 2
E 今年 20 n = 5 age(5) = 20
得到函数
def age(n):
if n == 5:
return 20
elif n >0 and n < 5:
return age(n+1) + 2 print(age(1))
递归函数:二分法查找算法
假设有这样一个列表,从中找到66的位置,如何做?
x = [2, 3, 5, 10, 15, 16, 18, 22, 26, 30, 32, 35, 41, 42, 43, 55, 56, 66, 67, 69, 72, 76, 82, 83, 88]
已知的,此处我们有两种方法
lst = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] # 方法1
print(lst.index(66)) # 方法2:
num = 0
for i in lst:
if i == 66:
print('找到了,在位置:',num)
num += 1
若没有索引和for循环呢? 此处我们用二分法。
2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88 # 先找到中间数41,41 < 66 42,43,55,56,66,67,69,72,76,82,83,88 # 再找到42-88中间数,67 > 66
42,43,55,56,66, # 找到 42-66中间数 55 < 66
56,66 # 找56-66中间数
66 # 最后找到66
每次切片导致原列表发生改变,索引也随着改变。
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def find(l,aim):
mid_index = len(l) // 2
if l[mid_index] < aim:
new_l = l[mid_index + 1 :]
find(new_l,aim)
elif l[mid_index] > aim:
new_l = l[:mid_index]
find(new_l,aim)
else:
print('找到了',mid_index,l[mid_index]) find(l,66)
修改至索引不发生改变,但是这里需要面对几个问题:
1.end=len(l)此处不可变
2.如果数字不在列表内的问题
3.返回值问题
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def find(lst,aim,start=0,end=len(l)):
mid_index = (end - start) // 2 + start
if lst[mid_index] < aim:
find(lst,aim,start=mid_index+1,end=end)
elif lst[mid_index] > aim:
find(lst,aim,start=start,end=mid_index-1)
else:
print('找到了',mid_index,aim)
find(l,66)
然后有了最终版:
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def find(lst,aim,start=0,end=None):
end = len(lst) if end is None else end # 如果end是默认空值,就用end,如果传回来不是空则用传回来的
mid_index = (end - start) // 2 + start
if start <= end:
if lst[mid_index] < aim:
return find(lst,aim,start=mid_index+1,end=end)
elif lst[mid_index] > aim:
return find(lst,aim,start=start,end=mid_index-1)
else:
return ('找到了',mid_index,aim)
else:
return ('找不到这个值')
ret = find(l,83)
print(ret)
斐波那契数列
1,1,2,3,5,8,13,21
双递归效率及其低下,双递归
def feib(n):
if n == 1 or n ==2 :
return 1
else:
return feib(n-1) + feib(n - 2) ### 双递归 ret = feib(8)
print(ret)
day17.初识递归函数的更多相关文章
- python基础一 day17 初识递归
#递归函数 # 了解什么是递归 : 在函数中调用自身函数 # 最大递归深度默认是997/998 —— 是python从内存角度出发做得限制 # 能看懂递归 # 能知道递归的应用场景 # 初识递归 —— ...
- day17:递归函数
1,递归函数是一个函数体系,非常的难 2,练习题一 # 3.用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb name=['alex','wupeiqi','yuanhao',' ...
- python 全栈开发,Day17(初识面向对象)
一.引子 第一次参加工作,进入了一家游戏公司,公司需要开发一款游戏<人狗大战>一款游戏,首先得把角色和属性定下来. 角色有2个,分别是人和狗属性如下:人 :昵称.性别.血.攻击力狗 :名字 ...
- Python之递归函数
递归函数 初识递归函数 递归函数的定义:在一个函数里再调用这个函数本身 Python为了考虑保护内存占用情况,有一个递归深度的限制. 探究递归的默认最大深度: def foo(n): print(n) ...
- python:递归函数
1,初识递归函数 1)什么是递归函数? 在函数中自己调用自己叫做递归函数 递归函数超过一定程度会报错.---RecursionError: maximum recursion dep th excee ...
- python之路——17
王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594 复习 1.迭代器2.生成器3.内置函数 1.学习55个 2.带key的,max min filter map ...
- python基础篇(四)
PYTHON基础篇(四) 内置函数 A:基础数据相关(38) B:作用域相关(2) C:迭代器,生成器相关(3) D:反射相关(4) E:面向对象相关(9) F:其他(12) 匿名函数 A:匿名函数基 ...
- 2018-11-9-匿名函数&递归函数初识
1.匿名函数(lambda) 2.递归函数初识
- python之内置函数(二)与匿名函数、递归函数初识
一.内置函数(二)1.和数据结构相关(24)列表和元祖(2)list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素).tuple:将一个可迭代对象转化成元组(如果是字典,默认将k ...
随机推荐
- mysql主从复制、redis基础、持久化和主从复制
一.mysql(mariadb)基础 1.基础命令(centos7操作系统下) 1.启动mysql systemctl start mariadb 2.linux客户端连接自己 mysql -uroo ...
- Android学习第九天
为什么需要内容提供者 a) 如何创建数据库 b) 文件权限 c) Chmod linux修改权限 内容提供者原理 a) 内容提供者把数据进行封 ...
- luoguP4841 城市规划
题意: 求n个点的无相连通图的个数.有编号 思路一: 黏博客 至于为什么除以k!:(没有博客中说的那么简单) 实际上, 对于一个n的用k个自然数的拆分,每一个拆分的贡献是: $\frac{n!*\Pi ...
- Vue, React, AngularJS, Angular2 我们对流行JavaScript框架们的选择
转自<奇舞周刊>,好文章mark一下 分割线 一个有趣的事实是:IBM发表的2017年最值得学习的编程语言名单中,JavaScript榜上有名.这位IT巨头指出,JS在网站中惊人地达到94 ...
- 解决js复制在安卓和ios兼容问题
var clipboard = new ClipboardJS('.fr', { // target: function() { // return document.querySelector('d ...
- 映像文件工具srec
目录 映像文件工具srec 介绍与帮助 常用例子 常用选项 一个实际的例子 hex转bin 数据填充 文件合并 文件分割 加入CRC 查看信息 使用命令集合的文本 详细文件格式的描述 附录:MDK的例 ...
- 使用Spring-Integration实现http消息转发
目标:接收来自华为云的服务器报警信息,并转发到钉钉的自定义机器人中 使用Spring-Integration不仅节省了很多配置,还增加了可用性. 更多关于Spring-Integration的介绍可参 ...
- [Android] Android RxJava2+Retrofit2+OkHttp3 的使用(一) --基础篇 Retrofit2 的使用
本文是 Android RxJava2+Retrofit2+OkHttp3 的使用(一) --基础篇 Retrofit2 的使用 本文的目标是用 Retrofit写一个网络请求: 本文以从获取天气预报 ...
- 小程序图片转Base64
在小程序中,有些业务要用到 图片的 base64 wx.chooseImage({ success: res => { wx.getFileSystemManager().readFile({ ...
- 异常捕获try----catch
如果try语句里有return,返回的是try语句块中变量值. 详细执行过程如下: 如果有返回值,就把返回值保存到局部变量中: 执行jsr指令跳到finally语句里执行: 执行完finally语句后 ...