python 递归与高阶函数

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

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

def calc(n):
    print(n)
    return calc(n)

calc(10)

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

RecursionError: maximum recursion depth exceeded while calling a Python object

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

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

import sys
print(sys.getrecursionlimit())

执行输出 1000

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

sys.setrecursionlimit(2000)

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

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

递归特性:

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

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

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

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

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

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

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呢,打印一下就知道了

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。不满足判断条件,程序终止。

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

效果如下:

高阶函数

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Go语言中反射的正确使用

介绍 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力。不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型。 反射有两个问题...

3628
来自专栏PHP实战技术

你真的懂let和const吗?

在ES6之前我们脑海里应该只存在全局作用域和函数级作用域,没有块级作用域。那么为什么要引入块级作用域呢?

43011
来自专栏Kotlin源码阅读

kotlin源码阅读——函数式编程

我主要写Kotlin源码阅读,函数式编程的基本概念,概念大家可以在网上做一些了解,这里推荐一下百度百科的定义,函数式编程概念,蛮清晰的。

3295
来自专栏灯塔大数据

技术 | Python从零开始系列连载(六)

导读 为了解答大家初学Python时遇到各种常见问题,小灯塔特地整理了一系列从零开始的入门到熟练的系列连载 上一期学习了Python程序的基本控制流程,相信大家...

3407
来自专栏calmound

NBUT 1117 Kotiya's Incantation

题意:判断两个字符窜是否一样,不一样,或相似,字符窜包含大小写字母,'\n','\t','  ',‘\r’,所以一样所有的都一样,相似是只要字母顺序相同就行了,...

3526
来自专栏程序猿

枚举算法(Enumeration algorithm)实例一

(建议电脑看原文链接,平台的排版不太好,太累了。)描述:在n位的整数中,例如153可以满足1^3 + 5^3 + 3^3 = 153,这样的数称...

3846
来自专栏机器学习算法与Python学习

Python: 早点知道这些就不会这样了

现在在Python 2的代码中都用import from future来导入Python 3的输出和除法。现在用到的几乎所有库都支持Python 3,因此会很快...

2754
来自专栏Golang语言社区

Go语言中反射的正确使用

介绍 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力。不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型。 反射有两个问题...

36916
来自专栏Java架构沉思录

你真的懂Java中的String、StringBuilder和StringBuffer吗?

相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String、StringBui...

1713
来自专栏技术/开源

30分钟?不需要,轻松读懂IL

先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用。到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.net理解更深一点...

2017

扫码关注云+社区

领取腾讯云代金券