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 ...
随机推荐
- 进程初识和multiprocessing模块之Process
一.什么是进程 进程就是运行中的程序 进程是操作系统中最小的资源分配单位 进程与进程之间的关系 : 数据隔离的 进程的id:Process id = pid pid是一个全系统唯一的对某个进程的标识, ...
- redis持久化和主从同步
redis持久化rdb与aof 简介 Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的 ...
- [TJOI2015]概率论
[TJOI2015]概率论 史上最短黑题 看起来一脸懵逼,没有取模,1e-9 根据期望定义,发现 分母是一个卡特兰数,,,,不能直接算 所以考虑怎么消掉一些东西 gn表示n个点的叶子个数和,fn表示n ...
- ZOJ Monthly, January 2018
A 易知最优的方法是一次只拿一颗,石头数谁多谁赢,一样多后手赢 #include <map> #include <set> #include <ctime> #in ...
- Windows 环境下的 protoc 安装(转)
如果是为了编译hadoop2.8.0源码,必须使用2.5.0版本的protobuf,安装方法同下 1. 下载需要的安装包:https://github.com/google/protobuf/rele ...
- 第十六节: EF的CodeFirst模式通过Fluent API修改默认协定
一. 简介 1. 优先级:Fluent API > data annotations > default conventions. 2. 所有的Fluent API配置都要在 OnMode ...
- 小程序图片转Base64
在小程序中,有些业务要用到 图片的 base64 wx.chooseImage({ success: res => { wx.getFileSystemManager().readFile({ ...
- Excel 当前行高亮
格式-条件格式-条件(公式)- =ROW()=CELL("row") 再选颜色...即可.
- AB PLC分类
AB PLC产品更新速度还是挺快的,以前很多产品都停产了,所以分类也跟着调整,就目前而言: 一.主要类型 AB PLC按类型,主要分为三大类: • 小型:MicroLogix控制器 • 中型:Comp ...
- iPhone8再MacOS上修改手机铃声
1 选择下载好的mp3铃声文件,导入到itunes 2 将音乐改成AAA模式, 设置你的铃声时长 3 show in finder 找到文件,将mpr后缀修改成m4r,并删除掉mp3文件,将m4r文件 ...