前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python 递归与高阶函数

python 递归与高阶函数

作者头像
py3study
发布2018-08-02 15:55:38
9690
发布2018-08-02 15:55:38
举报
文章被收录于专栏:python3

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

一个简单的递归函数(不正式)

代码语言:javascript
复制
def calc(n):
    print(n)
    return calc(n)

calc(10)

执行输出一堆10之后,报错

RecursionError: maximum recursion depth exceeded while calling a Python object

提示调用该对象超过最大递归深度

查看python默认的最大递归深度,需要用sys模块

代码语言:javascript
复制
import sys
print(sys.getrecursionlimit())

执行输出 1000

这个深度,可以通过setrecursionlimit()更改

代码语言:javascript
复制
sys.setrecursionlimit(2000)

除非特殊需要,不建议更改,会拖垮机器的。

比如生活中的一个场景,2面镜子,对立着放着。你会里面,有无数个镜子,递归也是这样的。

递归特性:

1. 必须有一个明确的结束条件

2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

问题规模,指的是传递参数。比如说第一次传进去10,第二次,就不应该还是10,要比10小,否则程序无法结束。

下面将一个正式的递归函数

传一个参数进去,每次除以2,直到不能除为止,程序结束。

代码语言:javascript
复制
def calc(n):
    print(n)
    #余数不能有小数,转换为整形
    if int(n/2) > 0:
        return calc(int(n/2))

calc(10)

执行输出

10

5

2

1

说明:

1. 传参数10进去,输出10

2. 10/2 结果为5,输出5

3. 5/2 结果为2.5,结果取整,输出2

4. 2/2 结果为1,输出1

最后一步,1/2 结果小于0,不满足判断条件,程序终止。

为了验证最后一步,是不是1呢,打印一下就知道了

代码语言:javascript
复制
def calc(n):
    print(n)
    #余数不能有小数,转换为整形
    if int(n/2) > 0:
        return calc(int(n/2))
    print("end->",n)
    
calc(10)

执行输出

10

5

2

1

end-> 1

1/2结果为0.5 取整之后,结果0。不满足判断条件,程序终止。

为了方便查看程序的执行过程,可以通过给程序加断点,通过调试功能,观察过程

效果如下:

jindu2.gif
jindu2.gif

高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

代码语言:javascript
复制
def add(a,b,f):
    return f(a)+f(b)

res = add(3,-6,abs)
print(res)

执行输出 9

说明:

abs是python的内置方法,用来取绝对值的,它会返回一个 非负数

在执行add方法的时候,将abs赋值给f

那么return的时候,实际是 abs(3)+abs(-6)

最终结果为9

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/02/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档