16 Python 递归函数
递归
1.什么是递归 recursion 递归
递归的定义——在一个函数里再调用这个函数本身
在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归。
递归的最大深度——997
一个函数在内部调用自己
递归的层数在python里是有限制的 997/998层
2.层数可以修改 sys模块
import sys #python限制在997/998
sys.setrecursionlimit(10000000) #可以修改
COUNT = 0
def func(): #recursion 递归
global COUNT
COUNT += 1
print(COUNT)
func() func()
3.解耦
要完成一个完整的功能,但这个功能的规模要尽量小,并且和这个功能无关的其他代码应该和这个函数分离
1.增强代码的重用性
2.减少代码变更的相互影响 4.实例一,求年龄
#写递归函数必须要有一个结束条件
#alex
#1 alex egon + 2 n=1 age(1) = age(2) + 2
#2 egon wusir + 2 n=2 age(2) = age(3) +2
#3 wusir 金鑫 + 2 n=3 age(3) = age(4) +2
#4 金鑫 40 n=4 age(4) = 40 def age(n):
if n == 4:
return 40
return age(n+1)+2 # age(1) #46
# def age(1):
# return 46
#
# def age(2):
# return 44
#
# def age(3):
# return 42
#
# def age(4):
# if 4 == 4:
# return 40 复制代码
5.实例二,求阶乘
#求阶乘 n = 7 7*6*5*4*3*2*1
def func(n):
if n == 1:
return 1
else:
return n*func(n-1) ret = func(4)
print(ret) # #n = 4
# def func(4):
# return 4*6
#
# #n = 3
# def func(3):
# return 6
#
# #n = 2
# def func(2):
# return 2
#
# #n = 1
# def func(n):
# if n == 1:
# return 1
6.实例三,二分查找
#算法 计算的方法
def search(num,l,start=None,end=None):
start = start if start else 0
end = end if end else len(l) - 1
mid = (end - start)//2 + start #这里要加上开始的索引
if start > end: #如果差找不到返回None
return None
elif l[mid] > num : #17,17
return search(num,l,start,mid-1)
elif l[mid] < num:
return search(num,l,mid+1,end)
elif l[mid] == num:
return mid 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]
print(search(66,l)) def search(num,l,start=None,end=None): #66,[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]
start = start if start else 0 #start = 0
end = end if end else len(l) - 1 #end = 24
mid = (end - start)//2 + start #mid = 12
if l[mid] > num : #l[mid] = 41 < 66
search(num,l,start,mid-1)
elif l[mid] < num:
ret = search(num,l,mid+1,end) #search(66,l,13,24)
return ret
elif l[mid] == num:
return mid, l[mid] def search(num,l,start=None,end=None): #66,[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]
start = start if start else 0 #start = 13
end = end if end else len(l) - 1 #end = 24
mid = (end - start)//2 + start #mid = 18
if l[mid] > num : #l[mid] = 67 > 66
search(num,l,start,mid-1) #search(66,l,13,17)
elif l[mid] < num:
ret = search(num,l,mid+1,end)
return ret
elif l[mid] == num:
return mid, l[mid] def search(num,l,start=None,end=None): #66,[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]
start = start if start else 0 #start = 13
end = end if end else len(l) - 1 #end = 17
mid = (end - start)//2 + start #mid = 15
if l[mid] > num : #l[mid] = 56 < 66
search(num,l,start,mid-1)
elif l[mid] < num:
ret = search(num,l,mid+1,end) #search(66,l,16,17)
return ret
elif l[mid] == num:
return mid, l[mid] def search(num,l,start=None,end=None): #66,[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]
start = start if start else 0 #start = 16
end = end if end else len(l) - 1 #end = 17
mid = (end - start)//2 + start #mid = 16
if l[mid] > num : #l[mid] = 56 < 66
search(num,l,start,mid-1)
elif l[mid] < num:
ret = search(num,l,mid+1,end) #search(66,l,17,17)
return ret
elif l[mid] == num:
return mid, l[mid] def search(num,l,start=None,end=None): #66,[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]
start = start if start else 0 #start = 17
end = end if end else len(l) - 1 #end = 17
mid = (end - start)//2 + start #mid = 17
if l[mid] > num : #l[mid] = 66 == 66
search(num,l,start,mid-1)
elif l[mid] < num:
search(num,l,mid+1,end)
elif l[mid] == num:
return mid, l[mid] #return 17,66
7实例四,斐波那契数列
#斐波那契
#1,1,2,3,5,8
def fib(n):
if n==1 or n==2:
return 1
return fib(n-1) + fib(n-2) # print(fib(6)) # def fib(6):
# return 5 + 3
#
# def fib(5):
# return 5
#
# def fib(4):
# return 3
#
# def fib(3):
# return 2
#
# def fib(2):
# if n==1 or n==2:
# return 1
#
# def fib(1):
# if n == 1 or n == 2:
# return 1
8.实例五,面试真题
#面试真题 # 有⼀个数据结构如下所示,请编写⼀个函数从该结构数据中返回由指定的字段和对应的值组成的字典。如果指定字段不存在,则跳过该字段。(10分)
data={"time":"2016-08-05T13:13:05",
"some_id":"ID1234",
"grp1":{ "fld1":1,"fld2":2},
"xxx2":{ "fld3":0,"fld5":0.4},
"fld6":11,
"fld7":7,
"fld46":8}
#fields:由"|"连接的以"fld"开头的字符串,如:fld2|fld3|fld7|fld19 def select(data,fields,result = {}): #这里默认参数创建一个空字典,利用了默认参数可变类型的陷阱,修改字典始终修改的是一个字典
field_lst = fields.split('|')
for key in data:
if key in field_lst:
result[key] = data[key]
elif type(data[key]) == dict:
select(data[key], fields)
return result fields = 'fld2|fld3|fld7|fld19'
ret = select(data,fields)
print(ret) #方法二
def select(data,fields):
result = {}
field_lst = fields.split('|')
for key in data:
if key in field_lst:
result[key] = data[key]
elif type(data[key]) == dict:
res = select(data[key],fields)
result.update(res)
return result
9.实例六,三级菜单
#3.三级菜单
menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'网易': {},
'google': {}
},
'中关村': {
'爱奇艺': {},
'汽车之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龙观': {},
},
'朝阳': {},
'东城': {},
},
'上海': {
'闵行': {
"人民广场": {
'炸鸡店': {}
}
},
'闸北': {
'火车战': {
'携程': {}
}
},
'浦东': {},
},
'山东': {},
}
# 相同的数据类型 嵌套在一起
def Three_Level_Menu(menu):
while True:
for k in menu:print(k)
key = input('>>>')
if key == 'q':return 'q' #到最上层接收的q,遇到return结束,返回q有没有人接收都没关系
elif key == 'b':break #如果输入b,跳出本层循环
elif key in menu:
ret = Three_Level_Menu(menu[key])
if ret == 'q': return 'q' #如果接收到的是q,也往上返回一个q
Three_Level_Menu(menu)
16 Python 递归函数的更多相关文章
- Python 递归函数 详解
Python 递归函数 详解 在函数内调用当前函数本身的函数就是递归函数 下面是一个递归函数的实例: 第一次接触递归函数的人,都会被它调用本身而搞得晕头转向,而且看上面的函数调用,得到的结果会 ...
- python递归函数(10)
一个函数在函数体内部调用自己,这样的函数称为递归函数,递归的次数在python是有限制的,默认递归次数是997次,超过997次会报错:RecursionError. 一.递归函数案例 案例一:计算数字 ...
- Python递归函数和二分查找算法
递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属 ...
- Python递归函数,二分查找算法
目录 一.初始递归 二.递归示例讲解 二分查找算法 一.初始递归 递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但 ...
- python 递归函数
在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: f ...
- python递归函数下不能正常使用yield
# -*- coding:utf-8 -*- import os import time file_list = [] def findFile(path): listFile = os.listdi ...
- Python递归函数
参考: https://pythonspot.com/recursion/ https://www.python-course.eu/recursive_functions.php 一.递归函数两大要 ...
- 2019.04.16 python基础50
第五十一节 pycharm安装 https://www.jetbrains.com/pycharm/download/#section=windows 这是另一个叫jetbrains公司开发的 默认 ...
- python 递归函数操作方法
.递归 是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知.使用递归解决问题,思路清晰,代码少.但是在主流 ...
随机推荐
- Python的模块与函数以及与自动化的结合
3 模块与函数 3.1程序结构 python的程序由package,module,function组成,分别是包,模块,函数.模块是函数和类的集合,包,模块,函数之间的关系如下: 3.2模块 pyth ...
- sql server2005版本中,len函数计算了字符串末尾的空格
sql server2005版本中,len函数计算了字符串末尾的空格的长度,以下是测试脚本: print @@version declare @v varchar(max) set @v = 'hp, ...
- 剑指offer 面试7题
面试7题: 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{ ...
- Java - 在控制台中执行一个可执行jar
1.Maven打包一个可执行jar: <build> <plugins> <plugin> <groupId>org.apache.maven.plug ...
- Google Cloud Platfrom中运行基础的Apache Web服务
Links: https://cloud.google.com/compute/docs/tutorials/basic-webserver-apache 步骤: 1.安装Apache 2.重写Apa ...
- foreach使用和函数
2016-04-25 一.foreach( 对集合每个元素的引用 in 集合 ) { } int[] a = new int[5]{1,2,3,4,5}; foreach( int b in a ) ...
- python3 multiprocessing 模块
多进程 Multiprocessing 模块 multiprocessing 模块官方说明文档 Process 类 Process 类用来描述一个进程对象.创建子进程的时候,只需要传入一个执行函数和函 ...
- asp.net,缓存Cache
缓存Cache: >直接使用Cache["content"],缓存与Session不同,所有用户都可以共享.永不过期,由服务器自己维护,当内存不够时,会将老的缓存释放掉. & ...
- Django-实现图片验证码
Django实现图片验证码 Python生成随机验证码,需要使用PIL模块. pip3 install pillow 1.基本使用 1. 1 创建图片 from PIL import Image im ...
- Python 时间日历类型
# 时间日历 # time模块 # 提供了处理时间和表示之间转换的功能 # 获取当前时间戳 # 概念 # 从0时区的1970年1月1日0时0分0秒, 到所给定日期时间的秒数 # 浮点数 # 获取方式 ...