zoukankan      html  css  js  c++  java
  • python之理解——递归

    古之欲明明德于天下者,先治其国;欲治其国者,先齐其家;欲齐其家者,先修其身;欲修其身者,先正其心;欲正其心者,先诚其意;欲诚其意者,先致其知,致知在格物。物格而后知至,知至而后意诚,意诚而后心正,心正而后身修,身修而后家齐,家齐而后国治,国治而后天下平。

    这是从林海峰博客里面copy的。很好的解释了,python函数的递归。

    那什么是递归?

    在函数内部,可以调用其他函数。如果在调用一个函数的过程中直接或间接调用自身本身

    def digui(n):
        print(n)
        digui(n)
    digui(10)
    递归的样子

    这个函数是无休止进行下去的,如何停止?

    所以我们需要利用函数的返回值——return

    简单举例递归

    def fan(n):
        # print(n)
        if int(n / 2) == 0:
            return n
        res=fan(int(n / 2))
        return res
    v=fan(5)
    print(v)
    初识递归
    1.fan(5)——调用函数fan,n=5
    2. print(n)——打印5,表示n=5
    3.if int(n / 2) == 0:——判断5/2是否为0,不满足
    4. res=fan(int(n / 2))——执行res,fan(2)*取整*
    5.fan(2)——执行fan(2)
    6.print(2)——打印2,表示n=2
    7.if int(n / 2) == 0:——判断2/2是否为0,不满足
    8.res=fan(int(n / 2))——执行res,fan(1)
    9.fan(1)——执行fan(1)
    10.print(1)——打印1,表示n=1
    11.if int(n / 2) == 0:——判断1/2是否为0,*取整*,满足
    12.return n——返回n,n现在等于1
    13.思考:n等于1返回的历程
    是直接返回到fan(5)?还是先返回到fan(2),fan(2)得到一个返回值,fan(2)再返回到fan(5)

    用更简单的例子来说就是:

    假如我是一个班级的学生,我想在我的班找一本书。

    我问同学A:“同学你知道书在什么地方?”

    A回答:“我不知道,我帮你问问B”

    A问B:“同学你知道书在什么地方?”

    B回答A:“我不知道,我帮你问问C”

    B问C:”同学你知道书在什么地方?”

    C回答B:“书在书架的最下面”

    B现在知道书在什么地方,B就告诉A,然后A就告诉我。

    students_list=['A','B','C','D']
    def fund_book(students_list):
        if len(students_list)==0:
            return '没有人知道书在什么地方'
        student=students_list.pop(0)
        if student=='C':
            return'{0}说:我知道,书放在书架最下面'.format(student)
    
        print('同学{0},你知道书在哪里?'.format(student))
        print('{0}回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问{1}'.format(student,students_list))
    
        res=fund_book(students_list)
        print('%s问的结果是: %res' % (student, res))
        return res
    
    v=fund_book(students_list)
    print(v)
    完美理解递归

    总结

    递归特性:

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

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

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

  • 相关阅读:
    文件处理
    三元运算
    python 第二章 二进制运算、字符编码、数据类型
    python 第一章 基础语法
    刷题-力扣-611. 有效三角形的个数
    刷题-力扣-581. 最短无序连续子数组
    刷题-力扣-LCP 07. 传递信息
    刷题-力扣-1833. 雪糕的最大数量
    刷题-力扣-168. Excel表列名称
    刷题-力扣-337. 打家劫舍 III
  • 原文地址:https://www.cnblogs.com/shi-py-rengongzhineng/p/9363412.html
Copyright © 2011-2022 走看看