python函数递归调用的实现

 更新时间:2023年05月06日 16:14:11   作者:程序员 老波  
本文主要介绍了python函数递归调用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Python客栈送红包、纸质书

引入

函数既可以嵌套定义也可以嵌套调用。嵌套定义指的是在定义一个函数时在该函数内部定义另一个函数;嵌套调用指的是在调用一个函数的过程中函数内部有调用另一个函数。而函数的递归调用指的是在调用一个函数的过程中又直接或者间接的调用该函数本身。

函数递归介绍

函数递归就是函数的递归调用,是函数嵌套调用的一种特殊形式,具体就是指在调用一个函数的过程中直接或者间接的调用到本身,递归的本质就是循环做重复的事情。

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

在调用func的过程中调用foo,而在调用foo的过程中又调用func,这就是间接调用func本身。

通过上面的分析,两种情况下的函数递归调用都是一个无限循环的过程,Python为了防止函数递归进入无限循环对函数递归调用的深度做了限制,一旦超出限制就会抛出异常。

1
2
3
4
5
6
7
8
9
10
11
def foo():
    print('foo')
    func()
def func():
    print('func')
    foo()
func()
'''
程序运行结果:
RecursionError: maximum recursion depth exceeded while calling a Python object(超过最大递归深度)
'''

因此为了避免函数递归调用报错,就必须在满足某中条件的情况下结束对函数的递归调用。

1
2
3
4
5
6
7
def foo(n):
    if n == 1:
        print('递归结束')
        return
    else:
        foo(n-1)
foo(2)

函数递归原理及使用

通过一个简单的小学数学题说明递归的原理及使用。

小一比小二多一个苹果,小二比小三多一个苹果,小三比小四多一个苹果,小四有两个苹果,问小一有几个苹果?

这个题目非常简单,解答思路如下:

1
2
3
4
5
6
7
8
要想知道小一的苹果数量就需要知道小二的苹果数量,而小二的苹果数量又取决于小三,小三的苹果数量又是基于小四的苹果数量:
app_num(1) = app_num(2) + 1
app_num(2) = app_num(3) + 1
app_num(3) = app_num(4) + 1
app_num(4) = 2
因此可以总结出下面的结论:
app_num(4) = 2
app_num(x) = app_num(x+1) + 1

很明显是一个重复调用同一种方法的过程,只是参数不同,也就是一个递归的过程,通过上面的分析可以将递归过程分为两个阶段 - 回溯和递推。

回溯阶段:想要计算小一(x=1)的苹果数量就需要回溯得到小二(x+1)的苹果,以此类推,直到得到小四的苹果个数,此时app_num(4)已知,就无需再向前回溯。

递推阶段:从小四的苹果数量可以推算出小三的苹果数量,从小三的苹果数量可以推算出小二的,以此类推,一直推算出小一的苹果数量为止,递归结束。需要注意的是,递归一定要有结束条件,这里当x=1就是结束条件。

递归的本质就是在做重复的事情,理论上说递归可以解决的问题循环也都可以解决,只不过是在某种情况下使用递归更容易实现。

1
2
3
4
5
6
def apple_num(x):
    if x == 4# 结束递归的条件
        return 2
    return apple_num(x+1) + 1
apple_num1 = apple_num(1)
print(apple_num1)  # 5

Practice

一个嵌套多层的列表要求打印出所有的元素。

1
2
3
4
5
6
7
8
list1 = [[[1, 2], [3, 4], [5, [6, 7], [8, 9, 10], 11, 12], 13]]
def func(items):
    for elements in items:
        if type(elements) is list:
            func(elements)
        else:
            print(elements)
func(list1)

有一个按照从小到大顺序排列的数字列表,需要从该数字列表中找到我们想要的数字,如何更高效?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 使用二分法:先取出列表的中间位置的值,与需要的数字进行比较,如果中间位置的值大于需要的值,那么就在中间值的左侧2 进行比较,如果小于,那么就在中间值的右侧进行比较,如果刚好等于,就输出值。然后对上述步骤进行循环
list1 = [0,2,5,7,9,11,34]
find_num = 2
def func(find_num,list1):
    # 输出每次切分后生成的list1
    print(list1)
    mid_index = len(list1) // 2
    if find_num > list1[mid_index]:
        list1 = list1[mid_index+1:]
        func(find_num,list1)
    elif find_num < list1[mid_index]:
        list1 = list1[:mid_index]
        func(find_num,list1)
    elif find_num == list1[mid_index]:
        print(f'找到了{list1[mid_index]},索引为{mid_index}')
    elif len(list1)  == 0:
        print('不存在这个值')
        return
func(find_num,list1)

到此这篇关于python函数递归调用的实现的文章就介绍到这了,更多相关python函数递归调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://blog.csdn.net/nhb687096/article/details/130495646

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • Python编程使用tkinter模块实现计算器软件完整代码示例

    Python编程使用tkinter模块实现计算器软件完整代码示例

    这篇文章主要介绍了Python编程实现一个计算器软件完整代码示例,简单介绍了Tkinter的相关内容,然后分享了通过tkinter模块开发一个计算器的完整Python代码,具有一定借鉴价值,需要的朋友可以参考下。
    2017-11-11
  • AMP Tensor Cores节省内存PyTorch模型详解

    AMP Tensor Cores节省内存PyTorch模型详解

    这篇文章主要为大家介绍了AMP Tensor Cores节省内存PyTorch模型详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Python3安装Pymongo详细步骤

    Python3安装Pymongo详细步骤

    本篇文章主要介绍了Python3安装Pymongo详细步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • pytorch载入预训练模型后,实现训练指定层

    pytorch载入预训练模型后,实现训练指定层

    今天小编就为大家分享一篇pytorch载入预训练模型后,实现训练指定层,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 一篇文章弄懂Python中的可迭代对象、迭代器和生成器

    一篇文章弄懂Python中的可迭代对象、迭代器和生成器

    这篇文章主要给大家介绍了关于Python中可迭代对象、迭代器和生成器的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • python 实现将字典dict、列表list中的中文正常显示方法

    python 实现将字典dict、列表list中的中文正常显示方法

    今天小编就为大家分享一篇python 实现将字典dict、列表list中的中文正常显示方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Python中单例模式总结

    Python中单例模式总结

    单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
    2018-02-02
  • Python中sorted()用法案例代码

    Python中sorted()用法案例代码

    sorted() 作为 Python 内置函数之一,其功能是对序列(列表、元组、字典、集合、还包括字符串)进行排序,这篇文章主要介绍了Python中sorted()用法,需要的朋友可以参考下
    2023-02-02
  • 使用tensorflow实现矩阵分解方式

    使用tensorflow实现矩阵分解方式

    今天小编就为大家分享一篇使用tensorflow实现矩阵分解方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Python爬虫框架之Scrapy中Spider的用法

    Python爬虫框架之Scrapy中Spider的用法

    今天给大家带来的是关于Python爬虫的相关知识,文章围绕着Scrapy中Spider的用法展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06

最新评论