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 递归函数操作方法
.递归 是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知.使用递归解决问题,思路清晰,代码少.但是在主流 ...
随机推荐
- hadoop学习(一)概念理解
1.概念 1.1什么是hadoop? hadoop 是大数据存储和处理的框架,主要组成为文件存储系统hdfs和分布式计算框架mapreduce. 1.2能做什么,擅长做什么,不擅长做什么? 1.2.1 ...
- Happy Hours, Happy Days
No matter our age, being happy creates more happiness--making a better world for all of us. 无论青春与否,让 ...
- 3.7 基于51单片机+MC20的路径显示【使用STC15W内核】
需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...
- JAVA 遍历文件夹下文件并更改文件名称
周末因为一些原因,需要批量更改一些文件的名称,使其随机,就随手写了点代码. 增加一个随机字母: public static void changeName(String path){ File fil ...
- 【转】JAVA学习笔记----PL/SQL最差实践
1. 超长的PL/SQL代码 影响:可维护性,性能 症状: 在复杂的企业应用中,存在动辄成百上千行的存储过程或上万行的包.为什么是最差: 太长的PL/SQL代码不利于阅读,第三方工 ...
- JAVA虚拟机(JVM)以及跨平台原理(JDK、JRE、JVM)
相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就 ...
- LVM逻辑磁盘管理
一.简介 LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵 ...
- iOS 结构简单清晰的 设置页面
这个是也是看了人家的代码,觉得甚是简单清晰,也是比较容易扩展.拿来学习一下 效果展示: 重点有以下2处: 1 .建立groupModel 列清组元素:当前组list 集合, 是否有header 或者 ...
- Unicode与UTF-8/UTF-16/UTF-32的区别
Unicode的最初目标,是用1个16位的编码来为超过65000字符提供映射.但这还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题 (implantation head-ache's),尤其在 ...
- yii常用操作函数
<?php defined('YII_DEBUG') or define('YII_DEBUG', true); //当在调试模式下,应用会保留更多日志信息,如果抛出异常,会显示详细的错误调用堆 ...