递归

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 递归函数的更多相关文章

  1. Python 递归函数 详解

    Python 递归函数 详解   在函数内调用当前函数本身的函数就是递归函数   下面是一个递归函数的实例: 第一次接触递归函数的人,都会被它调用本身而搞得晕头转向,而且看上面的函数调用,得到的结果会 ...

  2. python递归函数(10)

    一个函数在函数体内部调用自己,这样的函数称为递归函数,递归的次数在python是有限制的,默认递归次数是997次,超过997次会报错:RecursionError. 一.递归函数案例 案例一:计算数字 ...

  3. Python递归函数和二分查找算法

    递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属 ...

  4. Python递归函数,二分查找算法

    目录 一.初始递归 二.递归示例讲解 二分查找算法 一.初始递归 递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但 ...

  5. python 递归函数

    在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: f ...

  6. python递归函数下不能正常使用yield

    # -*- coding:utf-8 -*- import os import time file_list = [] def findFile(path): listFile = os.listdi ...

  7. Python递归函数

    参考: https://pythonspot.com/recursion/ https://www.python-course.eu/recursive_functions.php 一.递归函数两大要 ...

  8. 2019.04.16 python基础50

    第五十一节  pycharm安装 https://www.jetbrains.com/pycharm/download/#section=windows 这是另一个叫jetbrains公司开发的 默认 ...

  9. python 递归函数操作方法

    .递归 是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知.使用递归解决问题,思路清晰,代码少.但是在主流 ...

随机推荐

  1. hadoop学习第四天-Writable和WritableComparable序列化接口的使用&&MapReduce中传递javaBean的简单例子

    一. 为什么javaBean要继承Writable和WritableComparable接口? 1. 如果一个javaBean想要作为MapReduce的key或者value,就一定要实现序列化,因为 ...

  2. Python编码规范 -- Python Style Guide

    Python代码风格规范. @1:参数缩进:(2种形式) <1> foo = long_function_name(var1, var2, var3, var4) #第1行有参数, 第2行 ...

  3. MVC4 中使用 Area 和 注意的地方

    在MVC项目中经常会使用到Area来分开不同的模块让项目结构更加的清晰. 步骤如下:  项目 –> 添加 -> 区域 (Area)  输入 Admin 添加成功后 Area包含:创建一个空 ...

  4. 请写一个python逻辑,计算一个文件中的大写字母数量

    import os os.chdir(r'C:\Users\Administrator\Desktop')#os.chdir切换到指定目录 with open('a.txt') as today: c ...

  5. iOS 绘制漂亮的折线图

    效果图是这样的: 关键是在 基本策略 是描点 和 连线. 折线基础版本,我找到网上的第三方,UUChart . 特点是朴素,简单,扩展性强. 效果图重点是在折线要有阴影,于是 重点 放在 折线发散的阴 ...

  6. jstl-functions标签

    比如需要再jstl中定义一个String类型的数组 <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl ...

  7. 收集整理的awk用法小结

    awk 用法:awk ‘ pattern {action} ‘ 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS 输 ...

  8. 【Head First Servlets and JSP】笔记8:监听者

    1.你不用了解所有监听者API,并不多,一共有8个.不过,你需要知道你能监听什么,以便在需要的时候可以查. 2.关于Session和Cookie.参见JavaWeb学习总结(十二)——Session ...

  9. linux+java+webdriver chrome handless无界面启动

    网上现有的解决方案要么是windows下的,要么是python的,搞了一天终于解决了,记录如下. 1 下载chrome linux版和对应版本的webdriver,我这里使用的是chrome66和ch ...

  10. Java I/O 小结

    主要内容: 一.输入流基类:InputStream 和 OutputStream(字节流). Reader 和 Writer(字符流) 二.文件字节流:FileInputStream和FileOutp ...