Python中的递归函数使用详解

 更新时间:2023年12月06日 09:27:11   作者:凌冰_  
这篇文章主要介绍了Python中的递归函数使用详解,递归函数是指某个函数调用自己或者调用其他函数后再次调用自己,由于不能无限嵌套调用,所以某个递归函数一定存在至少两个分支,一个是退出嵌套,不再直接或者间接调用自己;另外一个则是继续嵌套,需要的朋友可以参考下

一、什么是递归

在函数内部调用自己的函数。

二、什么是递归调用

一种特殊的嵌套调用,是指某个函数调用自己或者调用其他函数后再次调用自己。

由于不能无限嵌套调用,所以某个递归函数一定存在至少两个分支,一个是退出嵌套,不再直接或者间接调用自己;另外一个则是继续嵌套。

一般通过函数的输入参数来决定走哪个分支,所以递归函数一般都是带有参数的。

三、应用实例

1、递归函数:求和

def  funs(n):
    #1+2+3+4=10
    # 退出递归的分支
    if n==1:
       return 1
    # 递归调用
    return n+funs(n-1)
 
 # 求4的和
print(funs(4))

2、递归函数:求阶乘

def get_factorial(n):  # 定义阶乘函数
    #1*2*3*4=24
    # 退出递归的分支
    if n==1:
        return 1
    # 递归调用
    return n*get_factorial(n-1)
 
 # 求4的阶乘
print(get_factorial(4))

3、斐波拉契级数

有这样一个数列:1,1,2,3,5,8,13,21,34…。其第一元素和第二个元素等于 1,其他元素等于其前面两个元素的和。用数学公式表示如下:

# 分析:
# A  age(4) = age(4-1) +8
# B  age(3) = age(3-1) + 8
# C  age(2) = age(2-1) + 8
# D  age(1) = 16
# 回溯:一层一层的调用下去
# 递推:满足某种结束条件后,结束递归调用,然后一层一层返回。
def get_age(n):
    if n==1:  #结束递归调用
        return 16
    else:  #递归调用
        return get_age(n-1)+8
 
print(get_age(1))  #第1个人年龄
print(get_age(4))  #第4个人年龄

4、询问年龄:A比B大8岁,B比C大8岁,C比D大8岁,D是16岁

# 分析:
# A  age(4) = age(4-1) +8
# B  age(3) = age(3-1) + 8
# C  age(2) = age(2-1) + 8
# D  age(1) = 16
# 回溯:一层一层的调用下去
# 递推:满足某种结束条件后,结束递归调用,然后一层一层返回。
def get_age(n):
    if n==1:  #结束递归调用
        return 16
    else:  #递归调用
        return get_age(n-1)+8
 
print(get_age(1))  #第1个人年龄
print(get_age(4))  #第4个人年龄

5、对于一个有n个元素的列表,全排列得到所有的这些排列的列表。

一般对于 n 个元素的列表有 n! 种排列方式。如对于 [1,2,3] 有下面几种排列方法:

def get_combination(ll,start):
    """
    :param ll:  排序的列表
    :param start: 起始位置一般为0
    :return: 空
    """
    end=len(ll)  #记录元素个数
    if start==end:   #递归的结束条件
        print(ll)
    else:
        i=start  #指向本次需要排列的第一个位置(本轮需要固定的位置)
    # 循环排列的序列中的每一个数,
    for n in range(start,end):
        # 依次交换数据
        ll[n],ll[i]=ll[i],ll[n]
        #递归调用
        get_combination(ll,start+1)
        # 回到上一步,交换数据
        ll[n],ll[i]=ll[i],ll[n]
 
 
#1*2*3=6
get_combination([1,2,3],0)
 
#1*2*3*4=24
get_combination(['red','yellow','green','blue'],0)

全排列

四、引用标准库函数:itertools库

1、全排列可以使用这个标准库函数

import itertools
print(list(itertools.permutations([1, 2, 3], 3)))
 
print(list(itertools.permutations(range(3), 2)))

五、递归函数调用深度的默认最大值为 1000

1、当调用阶乘使用10万时 ,print(get_factorial(100000)),发生以下异常:

说明:

注意递归的深度。

由于递归会产生多次函数调用,而函数调用会消耗代码的栈空间,如果递归的深度太大,会导致栈溢出。

以上面的阶乘为例,如果计算 100000 的阶乘,在一般机器上都会出现栈溢出的问题

默认情况下,函数调用深度的最大值为 1000,如果达到或者超过 1000 就会出现上面的错误信息。

import sys
 
# 得到最大调用深度
print(sys.getrecursionlimit())

如果希望修改该系统值,也可以通过 sys 模块的接口函数来实现。 如希望最大函数调用深度为 100000,那么可以使用下面的代码进行修改:

# 设定最大调用深度
sys.setrecursionlimit(10000)

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

相关文章

  • 详解python 拆包可迭代数据如tuple, list

    详解python 拆包可迭代数据如tuple, list

    拆包是指将一个结构中的数据拆分为多个单独变量中。下面通过本文给大家介绍python 拆包可迭代数据如tuple, list的相关资料,需要的朋友参考下吧
    2017-12-12
  • python如何修改PYTHONPATH环境变量

    python如何修改PYTHONPATH环境变量

    这篇文章主要介绍了python如何修改PYTHONPATH环境变量问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 详解pyinstaller生成exe的闪退问题解决方案

    详解pyinstaller生成exe的闪退问题解决方案

    这篇文章主要介绍了详解pyinstaller生成exe的闪退问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Python实现B站UP主小助手详解开发流程

    Python实现B站UP主小助手详解开发流程

    功能是不是还挺丰富的,从写第一行代码到完成也就花了两天不到的时间,这也证明了使用python开发的高效率,下面来说说这些功能开发中我遇到了哪些问题,我又是如何解决的
    2022-02-02
  • python (pyqt) 表格显示图片的实现方式

    python (pyqt) 表格显示图片的实现方式

    这篇文章主要介绍了python (pyqt) 表格显示图片的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Python语言实现科学计算器

    Python语言实现科学计算器

    这篇文章主要为大家详细介绍了Python语言实现科学计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Python使用unittest进行有效测试的示例详解

    Python使用unittest进行有效测试的示例详解

    这篇文章主要介绍了如何使用 unittest 来编写和运行单元测试,希望通过阅读本文,大家能了解 unittest 的基本使用方法,以及如何使用 unittest 中的断言方法和测试用例组织结构
    2023-06-06
  • Django框架实现的普通登录案例【使用POST方法】

    Django框架实现的普通登录案例【使用POST方法】

    这篇文章主要介绍了Django框架实现的普通登录案例,结合实例形式分析了Django框架使用POST方法进行页面登录、校验等相关操作技巧,需要的朋友可以参考下
    2019-05-05
  • Python的socket模块源码中的一些实现要点分析

    Python的socket模块源码中的一些实现要点分析

    我们平时引入Python的socket模块利用其中的方法可以轻松地写出搭建socket通信的程序,今天我们就来看一下Python的socket模块源码中的一些实现要点分析,领略Python简洁代码的一些背后功劳.
    2016-06-06
  • Pandas异常值处理小结

    Pandas异常值处理小结

    在Pandas中,异常值是数据中那些与其他数据点显著不同的点本文主要介绍了Pandas异常值处理小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07

最新评论