Python递归的几个经典案例

当我们碰到诸如需要求阶乘或斐波那契数列的问题时,使用普通的循环往往比较麻烦,但如果我们使用递归时,会简单许多,起到事半功倍的效果。这篇文章主要和大家分享一些和递归有关的经典案例,结合一些资料谈一下个人的理解,也借此加深自己对递归的理解和掌握一些递归基础的用法。

一、递归的简介

1、递归的百度百科定义

程序调用自身的编程技巧称为递归( recursion)。

递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或
间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进
段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

2、递归的通俗理解

递归就是在函数内部调用自己的函数被称之为递归。

3、几个关于递归通俗的比喻

1.我们使用的词典,本身就是递归,为了解释一个词,需要使用更多的词。当你查一个词,发现这个词的解释中某个词仍然不懂,于是你开始查这第二个词,可惜,第二个词里仍然有不懂的词,于是查第三个词,这样查下去,直到有一个词的解释是你完全能看懂的,那么递归走到了尽头,然后你开始后退,逐个明白之前查过的每一个词,最终,你明白了最开始那个词的意思。

2.一个小朋友坐在第10排,他的作业本被小组长扔到了第1排,小朋友要拿回他的作业本,可以怎么办?他可以拍拍第9排小朋友,说:“帮我拿第1排的本子”,而第9排的小朋友可以拍拍第8排小朋友,说:“帮我拿第1排的本子”...如此下去,消息终于传到了第1排小朋友那里,于是他把本子递给第2排,第2排又递给第3排...终于,本子到手啦!这就是递归,拍拍小朋友的背可以类比函数调用,而小朋友们都记得要传消息、送本子,是因为他们有记忆力,这可以类比栈。

3.一个洋葱是一个带着一层洋葱皮的洋葱。

4、最简单的递归的实例 

# 将 10不断除以2,直至商为0,输出这个过程中每次得到的商的值。
def recursion(n):
    v = n//2 # 地板除,保留整数
    print(v) # 每次求商,输出商的值
    if v==0:
        ''' 当商为0时,停止,返回Done'''
        return 'Done'
    v = recursion(v) # 递归调用,函数内自己调用自己
recursion(10) # 函数调用

输出结果:

5
2
1
0

5、递归的特点

通过以上的介绍,我们大致可以总结出递归的以下几个特点:

1、必须有一个明确的结束条件
2、每次进入更深一层递归时,问题规模(计算量)相比上次递归都应有所减少
3、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

关于递归还有两个名词,可以概括递归实现的过程

递推:像上边递归实现所拆解,递归每一次都是基于上一次进行下一次的执行,这叫递推

回溯:则是在遇到终止条件,则从最后往回返一级一级的把值返回来,这叫回溯

二、递归经典案例

1、递归求阶乘

实例如下:

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 1!+2!+3!+4!+5!+...+n!
def factorial(n):
    ''' n表示要求的数的阶乘 '''
    if n==1:
        return n # 阶乘为1的时候,结果为1,返回结果并退出
    n = n*factorial(n-1) # n! = n*(n-1)!
    return n  # 返回结果并退出
res = factorial(5) #调用函数,并将返回的结果赋给res
print(res) # 打印结果

2、递归推斐波那契数列

实例如下:

# 1,1,2,3,5,8,13,21,34,55,试判断数列第十五个数是哪个?
def fabonacci(n):
    ''' n为斐波那契数列 '''
    if n <= 2:
        ''' 数列前两个数都是1 '''
        v = 1
        return v # 返回结果,并结束函数
    v = fabonacci(n-1)+fabonacci(n-2) # 由数据的规律可知,第三个数的结果都是前两个数之和,所以进行递归叠加
    return v  # 返回结果,并结束函数
print(fabonacci(15)) # 610    调用函数并打印结果

3、二分法找有序列表指定值

实例如下:

data = [1,3,6,13,56,123,345,1024,3223,6688]
def dichotomy(min,max,d,n):
    '''
    min表示有序列表头部索引
    max表示有序列表尾部索引
    d表示有序列表
    n表示需要寻找的元素
    '''
    mid = (min+max)//2
    if mid==0:
        return 'None'
    elif d[mid]<n:
        print('向右侧找!')
        return dichotomy(mid,max,d,n)
    elif d[mid]>n:
        print('向左侧找!')
        return dichotomy(min,mid,d,n)
    else:
        print('找到了%s'%d[mid])
        return 
res = dichotomy(0,len(data),data,222)
print(res)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python递归的几个经典案例 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • 24道Python面试练习题

    1.简述函数式编程 答:在函数式编程中,函数是基本单位,变量只是一个名称,而不是一个存储单元。除了匿名函数外,Python还使用fliter(),map(),reduce(),apply()函数来支持函数式编程。 2.什么是匿名函数,匿名函数有什么局限性 答:匿名函数,也就是lambda函数,通常用在函数体比较简单的函数上。匿名函数顾名思义就是函数没有名字,…

    python 2023年4月22日
    00
  • Python的OptionParser模块教程

    Python中强大的选项处理模块。 示例 #!/usr/bin/pythonfrom optparse import OptionParser parser = OptionParser() parser.add_option(“-f”, “–file”, dest=”filename”, help=”write report to FILE”, meta…

    Python开发 2023年3月31日
    00
  • Python多任务教程

    一.并发和并行 多任务:一定时间段内,充分利用cpu资源,同时去执行多个任务 并发: 快速交替的 去执行多任务 并行: 真正同时的 去执行多任务 ,就是同时进行 二.多进程 1.多进程入门 知识点: 进程含义: 运行中的程序 进程特点: cpu资源分配的 最小单位 多进程模块: multiprocessing 进程类: Process 使用步骤: 导包 : …

    Python开发 2023年3月31日
    00
  • python中主要的英语单词汇总

    path [ pɑ:θ ] 路径 unexpected [ˌʌnɪkˈspektɪd] 不期望的 class [klɑ:s] 类 usage [ˈju:sɪdʒ] 使用 public [‘p ʌblik] 公共的,公用的 version [ˈvɜ:ʃn] 版本 private [‘praivit] 私有的,私人的 author [ˈɔ:θə®] 作者 sta…

    Python开发 2023年4月2日
    00
  • Python学习:property装饰器

    1.property 装饰器:装饰器是在不修改被装饰对象源代码以及调用方式的前提下为被装饰对象添加新功能的可调用对象 property是一个装饰器,是用来绑定给对象的方法伪造成一个数据属性 装饰器property,可以将类中的函数“伪装成”对象的数据属性,对象在访问该特殊属性时会触发功能的执行,然后将返回值作为本次访问的结果。 使用property有效地保证…

    Python开发 2023年4月2日
    00
  • Http和Https的区别?

    1.HTTP是什么? http是超文本传输协议用来在web浏览器和网站服务器之间传递数据信息,http以明文的方式发送内容,不提供任何方式的数据加密,如果攻击者截获了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。为了解决http协议的这一缺陷,需要使用另一种协议:安…

    Python开发 2023年4月2日
    00
  • Python学习:import的正确用法

    import语句用来导入其他python文件(称为模块module),使用该模块里定义的类、方法或者变量,从而达到代码复用的目的。 将要建立文件的结构为: Tree |____ m1.py |____ m2.py |____ Branch |____m3.py |____m4.py 首先,先建立一个文件夹Tree作为工作目录,并在其内建立两个文件m1.py和…

    Python开发 2023年4月2日
    00
  • Python第三方库安装教程、什么是第三方库

    Python有一个全球社区:https://pypi.org/,在这里我们可以搜索任何主题的Python第三方库。PyPI全称是Python Package Index,指的是Python包的索引,它由PSF(Python Software Foundation)来维护,并且展示全球Python计算生态。 我们需要学会利用PyPI的主站检索,找到我们使用和关…

    python 2023年5月8日
    00
合作推广
合作推广
分享本页
返回顶部