首页 > 其他分享 >函数递归

函数递归

时间:2023-01-26 22:33:09浏览次数:38  
标签:salary f1 调用 函数 递归 薪水 1000

目录

函数的递归调用介绍

回溯与递推

函数递归调用介绍

函数不仅可以嵌套定义,还可以嵌套调用,即在调用一个函数的过程中,函数内部又调用另一个函数,而函数的递归调用指的是在调用一个函数的过程中又直接或间接地调用该函数本身

例如

在调用f1的过程中,又调用f1,这就是直接调用函数f1本身

def f1():
    print('from f1')
    f1()
f1()

在调用f1的过程中,又调用f2,而在调用f2的过程中又调用f1,这就是间接调用函数f1本身

def f1():
    print('from f1')
    f2()
 
def f2():
    print('from f2')
    f1()
    
f1()

从上图可以看出,两种情况下的递归调用都是一个无限循环的过程,但在python对函数的递归调用的深度做了限制,因而并不会像大家所想的那样进入无限循环,会抛出异常,要避免出现这种情况,就必须让递归调用在满足某个特定条件下终止。

提示:

#1. 可以使用sys.getrecursionlimit()去查看递归深度,默认值为1000,虽然可以使用
sys.setrecursionlimit()去设定该值,但仍受限于主机操作系统栈大小的限制
#2. python不是一门函数式编程语言,无法对递归进行尾递归优化。

回溯与递推

下面我们用一个浅显的例子,为了让读者阐释递归的原理和使用:

例4.5

某公司四个员工坐在一起,问第四个人薪水,他说比第三个人多1000,问第三个人薪水,第他说比第二个人多1000,问第二个人薪水,他说比第一个人多1000,最后第一人说自己每月5000,请问第四个人的薪水是多少?

思路解析:

要知道第四个人的月薪,就必须知道第三个人的,第三个人的又取决于第二个人的,第二个人的又取决于第一个人的,而且每一个员工都比前一个多一千,数学表达式即:

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)

很明显这是一个递归的过程,可以将该过程分为两个阶段:回溯和递推。

在回溯阶段,要求第n个员工的薪水,需要回溯得到(n-1)个员工的薪水,以此类推,直到得到第一个员工的薪水,此时,salary(1)已知,因而不必再向前回溯了。然后进入递推阶段:从第一个员工的薪水可以推算出第二个员工的薪水(6000),从第二个员工的薪水可以推算出第三个员工的薪水(7000),以此类推,一直推算出第第四个员工的薪水(8000)为止,递归结束。需要注意的一点是,递归一定要有一个结束条件,这里n=1就是结束条件。

代码实现:

def salary(n):
    if n==1:
        return 5000
    return salary(n-1)+1000
 
s=salary(4)
print(s)

执行结果:

8000

程序分析:

在未满足n1的条件时,一直进行递归调用,即一直回溯,见图4.3的左半部分。而在满足n1的条件时,终止递归调用,即结束回溯,从而进入递推阶段,依次推导直到得到最终的结果。

递归本质就是在做重复的事情,所以理论上递归可以解决的问题循环也都可以解决,只不过在某些情况下,使用递归会更容易实现,比如有一个嵌套多层的列表,要求打印出所有的元素,代码实现如下

items=[[1,2],3,[4,[5,[6,7]]]]
def foo(items):
    for i in items:
        if isinstance(i,list): #满足未遍历完items以及if判断成立的条件时,一直进行递归调用
            foo(i) 
        else:
            print(i,end=' ')
    
foo(items) #打印结果1 2 3 4 5 6 7

使用递归,我们只需要分析出要重复执行的代码逻辑,然后提取进入下一次递归调用的条件或者说递归结束的条件即可,代码实现起来简洁清晰

标签:salary,f1,调用,函数,递归,薪水,1000
From: https://www.cnblogs.com/DragonY/p/17068347.html

相关文章

  • easyx.h画图相关函数
    1.getpixelCOLORREFgetpixel(intx,inty):用于获取点的颜色。参数:xx坐标来获得颜色。yy坐标来得到颜色。 2.putpixelvoidputpixel(intx,inty,COLORREFcolor):......
  • hdu:The Balance(母函数)
    ProblemDescriptionNowyouareaskedtomeasureadoseofmedicinewithabalanceandanumberofweights.Certainlyitisnotalwaysachievable.Soyoushou......
  • SQL Server 2005-2008 ROW_NUMBER() 分页函数效率
    --测试数据量:2161852条declare@idatetimeset@i=GETDATE();--SQL2005-2008--开始WITHtempAS(SELECTid,title,body,ROW_NUMBER()OVER(ORDERBYid)AS'Row......
  • 【C++ OOP 02 对象的初始化和清理】构造/析构函数、深/浅拷贝、初始化列表以及静态成
    【对象的初始化和清理】生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全C++中的面向对象来源于生活,每个对象也都会有......
  • 积性函数学习笔记
    数论分块对于形如\[\sum_{i=1}^nf(i)g(\lfloor\frac{n}{i}\rfloor)\]的式子,我们可以发现\(\lfloor\dfrac{n}{i}\rfloor\)的值可以分成若干块,具体的,设上一块的右边界为......
  • SQL Server 2000 函数使用---CAST 和 CONVERT
    将某种数据类型的表达式显式转换为另一种数据类型。CAST和CONVERT提供相似的功能。语法使用CAST:CAST(expressionASdata_type)使用CONVERT:CONVERT(data_type[(le......
  • (转)CreateProcess API函数的妙用
        CreateProcess(              LPCWSTRlpszImageName, //指向可执行的模块的指针            LPCWSTRlpszCmdLine, //指向可执行命......
  • Serverless 触发器和函数赋能自动化运维
    Serverless架构在运维层面有着得天独厚的优势,不仅因为其事件触发可以有针对性地获取、响应一些事件,还因为其轻量化、低运维的特性让很多运维开发者甚是喜爱。在实际生产中......
  • Python内置函数
    5.6Python内置函数Python自带的所有内置函数如下:Python函数以上为Python3.10中所有的内置函数,其中绝大部分在前面的学习当中都已经接触过了。这里在补充介绍下没有......
  • 函数计算与对象存储实现MapReduce
    Serverless架构可以在很多领域发挥极具价值的作用,包括监控告警、人工智能、图像处理、音视频处理等。同样,在大数据领域,Serverless架构仍然可以有良好的表现。以WordCount为......