递归函数

1. 递归(recursion)一个函数在内部调用了自己,这种写法就叫做递归。

def func(): # 每次调用一个函数,就会开辟一块内存空间

print("djgdl")

func() # 在内部调用自己

print(123) # 这句话不会打印

func()

2. 关于递归函数

1. 递归函数必须有一个结束条件,递归并不是无限制的,在python中默认最大深度是997或998。

2. 分析的流程拿到返回值,到一个结束条件的时候叫做递,返回值计算的时候叫做归。一定有递推的过程,不一定有回归的过程。

3. 最大递归深度

import sys

sys.setrecursionlimit(100000000) # 修改递归最大深度,一般不要去修改

COUNT = 0

def func():

global COUNT

COUNT += 1

print(COUNT)

func()

func()

4. 二分查找(重点)

def search(num,l,start=None,end=None):

start = start if start else 0 # start是开始查找的位置

end = end if end else len(l)-1 # end是结束查找的位置

mid = (end - start) // 2 + start #//是取到整数

if start > end: # 这里是当要查找的值不存在的时候,就返回一个None

return None

elif l[mid] > num:

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[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(66,l,start=None,end=None):

# 一开始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]

start = start if start else 0

end = end if end else 25-1

mid = (24 - 0) // 2 + 0 =12

elif 41 < 66:

return search(66,l,12+1,24)

def search(66,l,start=13,end=24): #search(66,l,12+1,24)

# 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]

start = start if start else 0

end = end if end else len(l)-1

mid = (24 - 13) // 2 + 13 =18

elif 67 > 66:

return search(66,l,13,17)

def search(66,l,start=13,end=17): #search(66,l,13,17)

# 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]

start = start if start else 0

end = end if end else len(l)-1

mid = (17 - 13) // 2 + 13 = 15

elif 55 < 66:

return search(66,l,17,17)

def search(66,l,start=16,end=17): #search(66,l,16,17)

# 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]

start = start if start else 0

end = end if end else len(l)-1

mid = (17 - 17) // 2 + 17

elif 66 == 66:

return 17,66

示例一: 1 的年龄问题 ,1 的年龄不知道,比 2 大2岁,2 比 3 大2岁,3 比 4 大2岁,4 的年龄是40

def age(n):

if n == 4:

return 40

return age(n+1)+2

ret = age(1)

print(ret)

# 递的过程:

def age(1):

return age(1+1)+2

def age(2):

return age(2+1)+2

def age(3):

return age(3+1)+2

def age(4):

if n == 4:

return 40

# 归的过程,从下往上返回值

age(1) = 46

def age(1):

return age(2)+2

age(2) = 44

def age(2):

return age(3)+2

age(3) = 42

def age(3):

return age(4)+2

age(4) = 40

def age(4):

if n == 4:

return 40

示例二: 求阶乘 7*6*5*4*3*2*1

def func(n):

if n == 1:

return n

return n*func(n-1)

ret = func(7)

print(ret)

# 递推

def func(7):

return 7*func(7-1)

def func(6):

return 6*func(6-1)

def func(5):

return 5*func(5-1)

def func(4):

return 4*func(4-1)

def func(3):

return 3*func(3-1)

def func(2):

return 2*func(2-1)

def func(1):

if 1 == 1:

return 1

# 回归

func(7)=5040

def func(7):

return 7*func(7-1)

func(6)=720

def func(6):

return 6*func(6-1)

func(5)=120

def func(5):

return 5*func(5-1)

func(4)=24

def func(4):

return 4*func(4-1)

func(3)=6

def func(3):

return 3*func(3-1)

func(2)=2

def func(2):

return 2*func(1)

func(1)=1

def func(1):

if 1 == 1:

return 1

示例三:三级菜单

menu = {

'北京': {

'海淀': {

'五道口': {

'soho': {},

'网易': {},

'google': {}

},

'中关村': {

'爱奇艺': {},

'汽车之家': {},

'youku': {},

},

'上地': {

'百度': {},

},

},

'昌平': {

'沙河': {

'老男孩': {},

'北航': {},

},

'天通苑': {},

'回龙观': {},

},

'朝阳': {},

'东城': {},

},

'上海': {

'闵行': {

"人民广场": {

'炸鸡店': {}

}

},

'闸北': {

'火车战': {

'携程': {}

}

},

'浦东': {},

},

'山东': {},

}

def three_menu(menu):

while True:

for k in menu:print(k)

key = input(">>>")

if key.lower() =="q":return "q" # return 一个q 就需要有变量去接收

elif key == "b":break # 当输入b的时候,就break,这里break是只能返回上一层,是因为有while,如果单独return和break的效果是一样的,所以下面才需要有个变量去接受

elif key in menu:

ret = three_menu(menu[key]) # 这里的ret就是去接收return回来的 q 的

if ret == "q":return "q" # 当ret=q的时候,就直接再return q 这样就保证了用户输入q,就会直接退出

three_menu(menu)

python中递归函数写法_Python之递归函数相关推荐

  1. python中递归函数写法_python中递归函数如何创建

    递归函数是编程技术之一,这意味着你的程序包含你自己调用的函数.与迭代函数一样,在多次执行类似处理时可以使用递归函数,但递归函数可以通过用简单的代码替换它们来处理更复杂的问题.本篇文章我们就来看看pyt ...

  2. python中fac函数_Python基础复习函数篇

    目录 1.猴子补丁 2. global和nonlocal关键字 3.迭代器和生成器 4.递归函数 5.高阶函数和lamdba函数 6.闭包 7.装饰器 1.   猴子补丁 猴子补丁主要用于在不修改已有 ...

  3. middles在python中什么意思_Python 基础知识入门(2)

    字符串格式化 Python字符串格式化有两种方式:百分号方式.format方式: 百分号的方式相对比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并在: 一.百分号方式 %[ ...

  4. python中function函数_Python基础---函数Function

    函数Function 定义:带名字的代码块,用于完成具体的工作 最基本的一种代码抽象的方式,借助函数,可以不用关心底层的具体计算过程,直接在更高层次上思考问题 在Python中,内置了多种多样的函数, ...

  5. python中定义字符串_Python中的字符串String

    Python中除了数字(Numbers)(int,float,complex)之外,另外一种重要的类型就是字符串. 字符串是字符序列,可以由任何字符构成. 在Python语言中,字符串可以放在单引号( ...

  6. python中基例_Python python从入门到实践(5) --代码复用

    函数.类与代码复用 代码复用的思想 把代码当成资源进行抽象. 代码资源化:程序代码是一种用来表达计算的"资源" 代码抽象化:使用函数等方法对代码赋予更高级别的定义 代码复用:同一份 ...

  7. python中函数参数_Python函数的参数

    本章将介绍函数中参数的用法,更多内容请参考:Python学习指南 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道传递正确的参数,以及函数就返回 ...

  8. python中定义数据结构_Python中的数据结构—简介

    python中定义数据结构 You have multiples algorithms, the steps of which require fetching the smallest value ...

  9. python中怎么计算_python中的加减乘除运算

    python中的加减乘除运算,是学习python入门的基础,是以后进行数学计算的关键部分.包括运算表达式的写法,运算规则,加减乘除,求余,求商等等. 工具/原料 python 电脑 方法/步骤 1 1 ...

最新文章

  1. php获取表字段,使用 php 获取表的字段信息
  2. namespace命名空间的理解C++
  3. 【Android工具】更新手机视频流媒体客户端播放器OPlayer
  4. Quartz- Quartz API以及Jobs 和Triggers介绍
  5. YC元老、硅谷天使投资第一人解读YC成功的秘密
  6. window使用技巧记录
  7. [crypto][ipsec] 简述ESP协议的sequence number机制
  8. 夹具PHP,PHP类的静态(static)方法和静态(static)变量
  9. java设计模式6.代理模式
  10. NYOJ-zb的生日(dfs)
  11. 【java学习之路】(数据结构篇)003.链表
  12. Fiddler代理配置
  13. sql中如何将视图中某一字段相同的数据合并 不同内容的字段相加_Tableau基础如何合并你的数据?理解与逻辑(上)...
  14. 如何区分abcd类地址_ip地址abc类怎么区分
  15. 阿里云轻量服务器使用
  16. linux_systemd启动方式解析,如何开机自动登录,开机自动运行程序
  17. 达梦数据库 防火墙设置
  18. 工作 10 年后,我突然决定读硕士了!
  19. Excel教程:数值为0不显示的三种解决方法介绍
  20. 报如下错误:android.util.AndroidRuntimeException: You cannot combine custom titles with other title featur

热门文章

  1. ​Redis的各种“坑”,你知道多少?
  2. 看看人家架构师那消息队列中间件玩的,那叫一个优雅!
  3. 万亿级流量高可用延时服务架构设计
  4. 高并发来袭,面向Google编程的程序员要小心了!
  5. Jeecg-Boot2.1.2 版本,手工集成Online在线开发模块(Online表单、Online报表)
  6. CSDN又力推一优秀开源项目jeecg,跨时代重构精华版发布
  7. SAP中的默认帐户与密码
  8. 二、Java面向对象(7)_封装思想——访问修饰符
  9. LVM逻辑卷管理命令
  10. vmware workstation 关于三种网络连接方式的理解