首页 > 编程语言 >Python:递归函数

Python:递归函数

时间:2023-12-13 17:12:31浏览次数:42  
标签:salary f1 递归 递归函数 Python 10 print 1000

一、函数的递归

  什么是函数的递归:函数的递归就是函数的递归调用:是函数嵌套调用的一种形式。

  具体是指:在调用一个函数的过程中又直接或者间接的调用到本身。

# 1、直接调用本身(简单理解为死循环 )
def f1():
    print('直接调用本身实例:')
    f1()
# 调用 f1()

# 由于没有设定退出条件,抛出异常 # RecursionError: maximum recursion depth exceeded while calling a Python object。 # python对递归做了限制1000层,否则无限的调用下去,不断的申请内存空间,直到内存溢出。 # 了解python的递归层级
import sys
>>> sys.getrecursionlimit()  # 可以使用sys.getrecursionlimit()去查看递归深度,默认值为1000
 1000 

>>> sys.getrecursionlimit(2000) # 可以自己定义对限制进行修改为2000,不建议这样做,容易造成内存溢出。
>>> sys.getrecursionlimit()
2000
python不是一门函数式编程语言,无法对递归进行尾递归优化(了解)
函数的递归:直接调用示意图:

# 2、间接调用本身()
def f1():
    print("===>f1")
    f2()

def f2():
    print("===>f2")
    f1()

f1()
# 打印之后,抛出对应异常 # RecursionError: maximum recursion depth exceeded while calling a Python object

函数的递归:间接调用示意图:

二、递归与循环
# 递归与循环:递归的本质就是循环,递归能做的,while循环都能做。
# 一段diamond循环的方案有两种
# 方式一:while、for循环
# while True:
#     print(1111)
#     print(2222)
#     print(3333)
# 这个不能停止

# 方式二:使用递归
def f1():
    print(1111)
    print(2222)
    print(3333)
    f1()

f1()
# RecursionError: maximum recursion depth exceeded while calling a Python object
# 需要强调一点:
# 1、递归不应该无限的调用下去,必须在满足某种条件下结束递归

# 使用while循环:输出1-10的数据
# n = 0
# while n<10:
#     print(n)
#     n +=1

# 使用递归:输出1-10的数据
def f1(n):
    if n == 10:
        return
    print(n)
    n += 1
    f1(n)
f1(0)

三、回溯和递推

# 递归两个阶段:回溯与递推

# 回溯:一层一层的调用下去
# 递推:满足某种结束条件后,结束递归调用,然后一层一层返回。

# 举例:询问年龄
# A比B大10岁,B比C大10岁,C比D大10岁,D比E大10岁,E为18岁  # 回溯:

# age(5) = age(4) + 10
# age(4) = age(3) + 10
# age(3) = age(2) + 10
# age(2) = age(1) + 10
# age(1) = 18

def age(n):
    if n == 1:
        return 18
    return age(n -1) + 10

res = age(5)
print(res)
某公司四个员工坐在一起,问第四个人薪水,他说比第三个人多1000,问第三个人薪水,第他说比第二个人多1000,
问第二个人薪水,他说比第一个人多1000,最后第一人说自己每月5000,请问第四个人的薪水是多少? 代码实现:
def salary(n):
    if n == 1:
        return 5000
    return salary(n - 1) + 1000

res = salary(4)
print(res)
思路解析:

要知道第四个人的月薪,就必须知道第三个人的,第三个人的又取决于第二个人的,第二个人的又取决于第一个人的,
而且每一个员工都比前一个多一千,数学表达式即:
# salary(4)-->salary(3)+1000-->salary(2)+1000 + 1000-->salary(1)+1000+1000+1000-->5000+1000+1000+1000
# salary(4)-->salary(3)+1000-->salary(2)+1000《==None+1000(TypeError: unsupported operand type(s) for +: 'NoneType' and 'int')《==5000+1000
# TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' 翻译:None类型和整型进行了加操作。
# 解决办法:添加返回值return
# salary(4) = 8000《==5000+1000+1000+1000《==5000+1000+1000《==5000+1000《==5000
#                      salary(4)            salary(3)         salary(2)    salary(1)
salary(4)=salary(3)+1000 
salary(3)=salary(2)+1000 
salary(2)=salary(1)+1000 
salary(1)=5000
总结为: 
salary(n)=salary(n-1)+1000 (n>1) 
salary(1)=5000 (n=1) 
 

回溯和递推示意图如下:

  四、递归的应用

# 需求:把如下列表的所有值取出来,并打印。
# l = [1,2,[3,[4,[5,[6,[7,[8,[9,10,11]]]]]]]]

# 方式一:使用循环实现需求
# l = [1,2,[3,4]]
# for x in l:
#     if type(x) is list:
#         # 如果是列表,应该再次循环,再次判读,再次打印,即重新运行本身的代码。
#         for a in x:
#             if type(a) is list:
#                 pass
#             else:
#                 print(a)
#     else:
#         print(x)
# 运行结果:1 2 3 4
# 方式二:使用递归实现需求 l = [1,2,[3,4]] def f1(list1): for x in list1: if type(x) is list: # 如果是列表,应该再次循环,再次判读,再次打印,即重新运行本身的代码。 f1(x) else: print(x) f1(l) # 运行结果:1 2 3 4 5 6 7 8 9 10 11

标签:salary,f1,递归,递归函数,Python,10,print,1000
From: https://www.cnblogs.com/jds-49127/p/17899439.html

相关文章

  • Python——第五章:处理异常try、except、else、finally
    在Python中,try和except语句用于处理异常(错误)。通过使用这两个关键字,你可以编写代码来捕获和处理可能发生的异常,以保持程序的稳定性。try:try代码except错误1as变量1:except1代码except错误2as变量2:except2代码except错误3as变量3:except3......
  • 如何在D盘上安装Python
    Python是一种功能强大且广泛使用的编程语言,非常适合开发各种类型的应用程序。在Windows操作系统中,默认情况下,Python会被安装在C盘上,但是用户也可以选择将其安装在其他驱动器,比如D盘。下面是在D盘上安装Python的步骤:1.下载Python安装程序:首先,你需要从官方Python网站下载Python的安装......
  • 【Python爬虫】Scrapy框架图片下载_桌面壁纸ZOL(纯案例)
    Spider代码classBizhizolSpider(scrapy.Spider):name="bizhizol"allowed_domains=["zol.com.cn"]start_urls=["https://desk.zol.com.cn/youxi/"]defparse(self,response,**kwargs):#print(response.te......
  • Python高级之装饰器
    装饰器【一】装饰器介绍装饰器的由来软件的设计应该遵循开放封闭原则,即对扩展是开放的,而对修改是封闭的。对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。对修改封闭,意味着对象一旦设计完成,就可以独立完成其工作,而不要对其进行修改。软件包......
  • 【Python爬虫】Scrapy框架文件写入方式CSV,MYSQL,MongoDB_爬取新浪彩票双色球
    Spider代码爬取新浪彩票双色球页面数据,只爬取期号、红球、篮球classShuangseqiu11Spider(scrapy.Spider):name="shuangseqiu11"allowed_domains=["sina.com.cn"]start_urls=["https://view.lottery.sina.com.cn/lotto/pc_zst/index?lottoType=ssq&......
  • C++堆——heap与二叉树和python
    数据结构栈-->stack队列-->queue树-->tree堆-->heap散列-->hash图-->graph图结构一般包括顶点和边邻接矩阵DAG,DirectedAcyclicGraph即「有向无环图」树树(Tree)是一种非线性的数据结构,由n个节点组成,其中每个节点都有零个或多个子节点。......
  • Python 初学之华为OD机试题:求最大数字
    题目描述给定一个由纯数字组成以宇符串表示的数值,现要求字符串中的每个数字最多只能出现2次,超过的需要进行删除;删除某个重复的数字后,其它数字相对位置保持不变。如"34533”,数字3重复超过2次,需要册除其中一个3,删除第一个3后获得最大数值"4533"。请返回经过删除操作后的最大的数值......
  • pythonDay22
    【序列化与反序列化】(定义) (使用) (案例) (猴子补丁) 【xml模块】(格式) (案例) 【importconfigparser模块】 写的不好,后续修改 【subprocess模块,执行系统命令】 ......
  • 【Python爬虫】Python爬虫入门教程&注意事项
    ​一、引言        随着互联网的快速发展,网络数据已经成为人们获取信息的重要来源。而爬虫技术作为获取网络数据的重要手段,越来越受到人们的关注。在众多编程语言中,Python因其易学易用、库丰富、社区活跃等优势,成为爬虫开发的首选。本文将带你走进Python爬虫的世界,让你......
  • Python——第五章:logging模块
    filename:文件名format:数据的格式化输出。最终在日志文件中的样子时间-名称-级别-模块:错误信息datefmt:时间的格式level:错误的级别权重,当错误的级别权重大于等于leval的时候才会写入文件importlogginglogging.basicConfig(filename='x1.txt',format='%(asc......