python函数递归调用的实现

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

引入

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

函数递归介绍

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

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

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

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

def foo():
    print('foo')
    func()
def func():
    print('func')
    foo()
func()
'''
程序运行结果:
RecursionError: maximum recursion depth exceeded while calling a Python object(超过最大递归深度)
'''

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

def foo(n):
    if n == 1:
        print('递归结束')
        return
    else:
        foo(n-1)
foo(2)

函数递归原理及使用

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

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

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

要想知道小一的苹果数量就需要知道小二的苹果数量,而小二的苹果数量又取决于小三,小三的苹果数量又是基于小四的苹果数量:
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就是结束条件。

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

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

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

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)

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

# 使用二分法:先取出列表的中间位置的值,与需要的数字进行比较,如果中间位置的值大于需要的值,那么就在中间值的左侧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函数递归调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用Pandas读取某列某行数据之loc和iloc用法总结

    利用Pandas读取某列某行数据之loc和iloc用法总结

    loc是location的意思,和iloc中i的意思是指integer,所以它只接受整数作为参数,下面这篇文章主要给大家介绍了关于利用Pandas读取某列某行数据之loc和iloc用法的相关资料,需要的朋友可以参考下
    2022-03-03
  • Python中的两个列表数值加法

    Python中的两个列表数值加法

    这篇文章主要介绍了Python中的两个列表数值加法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • python区块链实现简版工作量证明

    python区块链实现简版工作量证明

    这篇文章主要为大家介绍了python区块链实现简版工作量证明详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • python3实现读取chrome浏览器cookie

    python3实现读取chrome浏览器cookie

    这里给大家分享的是python3读取chrome浏览器的cookie(CryptUnprotectData解密)的代码,主要思路是读取到的cookies被封装成字典,可以直接给requests使用。
    2016-06-06
  • 对python pandas 画移动平均线的方法详解

    对python pandas 画移动平均线的方法详解

    今天小编就为大家分享一篇对python pandas 画移动平均线的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • tensorflow 实现自定义梯度反向传播代码

    tensorflow 实现自定义梯度反向传播代码

    今天小编就为大家分享一篇tensorflow 实现自定义梯度反向传播代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • python读取指定字节长度的文本方法

    python读取指定字节长度的文本方法

    今天小编就为大家分享一篇python读取指定字节长度的文本方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python实现京东秒杀功能代码

    Python实现京东秒杀功能代码

    这篇文章主要介绍了Python实现京东秒杀功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • openCV入门学习基础教程第三篇

    openCV入门学习基础教程第三篇

    pencv是用于快速处理图像处理、计算机视觉问题的工具,支持多种语言进行开发如c++、python、java等,下面这篇文章主要给大家介绍了关于openCV入门学习基础教程的相关资料,需要的朋友可以参考下
    2022-11-11
  • python argparse命令行参数解析(推荐)

    python argparse命令行参数解析(推荐)

    Python argparse模块是解析命令行参数的首选方法。解析命令行参数是一个非常常见的任务,Python脚本根据传递的值来执行和操作
    2021-06-06

最新评论