python3 递归函数

作者: 亭子青年 | 来源:发表于2017-08-29 15:26 被阅读107次

我还是那个在家带孩子的伪测试


学习笔记

  1. 如果一个函数在函数体重调用自身,那么这个函数就是递归函数
  2. 递归函数的优点是定义简单,逻辑清楚
  3. 使用递归函数需要注意防止栈溢出,在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧,由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出
  4. 尾递归是指,在函数返回的时候,调用函数自己,并且,return语句不能包含表达式=>这是一个表达式:return n*fun(n-1),应该return fun(n-1)
  5. 解决栈溢出的办法是通过尾递归优化,这样编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况
  6. 遗憾,遗憾,遗憾:大多数编程语言没有针对尾递归做优化,python解释器也没有优化,所以,即使将python的递归函数进行优化,也会存在栈溢出的情况

code

# 例子1:实现一个递归函数:计算n!=1*2*3*4*------*n
def fact(n):
    if n == 1:
        return 1
    else:
        return n * fact(n-1)
# 例子2:实现一个递归函数:对传入的dict进行key去重操作,将结果放到传入的set对象中
def dict_to_set(dict_ob,set_ob):
    for key, value in dict_ob.items():
        set_ob.add(key)
        if isinstance(value, dict):
            dict_to_set(value, set_ob)
        elif isinstance(value, list):
            for li in value:
                dict_to_set(li,set_ob)
    return set_ob
if __name__ == "__main__":
    dict01 = {"name":"ting","pass":"123","family":[{"name":"tian","age":1},{"name":"zhou","age":26}]}
    my_set = set()
    print(dict_to_set(dict01,my_set)) # 结果:{'name', 'pass', 'family', 'age'}

这里我记录一个坑,昨天我就掉进去了(怪我太无知),不过,大家可以跟着我的节奏,来写一个错误递归,看看效果

# 例子3:这是一个错误的递归,正确的方法参考例子2
def dict_to_set(dict_ob,set_ob):
    for key, value in dict_ob.items():
        set_ob.add(key)
        if isinstance(value, dict):
            return dict_to_set(value, set_ob)
        elif isinstance(value, list):
            for li in value:
                return dict_to_set(li,set_ob)
    return set_ob
if __name__ == "__main__":
    # 结果:异常
    dict01 = {"name":"ting","pass":"123","family":[{"name":"tian","age":1},{"name":"zhou","age":26}],"friend":[{"name":"yaya","age":21]},{"name":"ayu","age":12}}
    my_set = set()
    print(dict_to_set(dict01,my_set))

解释: 我们第一个例子中,调用本身是使用了return关键字,而后面的例子中,我们有使用了for循环,是不可以使用return dict_to_set()的,因为一旦return之后,for循环没有执行完的是不会继续执行的。

写在最后的话

真尴尬,我昨天写这几行代码花了我1个小时,本来想请教我家那位的,可是让我自己想办法解决,不然永远不会,我觉得说得在理,好在我还是写出来了。

相关文章

  • 019 Python语法之递归

    递归 1. 递归的定义 递归应用在函数上就是函数体内部有自己本身的调用,简单来说就是自己调用自己 Python3默...

  • python3 递归函数

    我还是那个在家带孩子的伪测试 学习笔记 如果一个函数在函数体重调用自身,那么这个函数就是递归函数 递归函数的优点是...

  • 递归

    1、函数内部调用自身的一种行为,并且有一个正确的停止条件 2、递归在python3中默认100层 3、设置递归的层...

  • Day10递归函数、模块、迭代器、生成器

    一、递归函数 1、什么是递归函数 在函数中调用函数本身的函数就是递归函数。 2、递归的作用 循环能做的递归都能做 ...

  • day11 函数(3)

    递归函数 实际开发的时候,能不用递归就不用 什么是递归函数 函数中调用函数本身的函数就是递归函数 递归的作用: 循...

  • python 递归函数

    递归函数 递归函数 : 在函数的调用自身 递归边界 : 退出递归的终止条件 例1,函数func如果没有设备递归边界...

  • day11-日常(递归函数、模块、迭代器、生成器)

    递归函数(实际开发的时候,能不用递归就不用) 1.什么是递归函数 函数中调用函数本身的函数就是递归函数 2.递归的...

  • 2019-01-07day11学习总结

    递归函数 实际开发的时候能不用递归就不用递归 1. 什么是递归函数 函数中调用函数本身的函数就是递归函数 2. 递...

  • 递归函数、模块、生成器、迭代器

    一、递归函数 实际开发的时候,能不用递归就不用 1.什么是递归函数 函数中调用函数本身的函数就是递归函数 2.递归...

  • day 11总结

    递归函数 实际开发的时候,能不用递归就不用1.什么是递归函数函数中调用函数本身的函数就是递归函数 2.递归的作用:...

网友评论

  • 倔强的潇洒小姐:我执行了正确递归和错误递归的代码,结果是一样的,还没搞懂
    亭子青年:已经改了,你用我的例子进行调试就能出现错误了
    亭子青年:@倔强的潇洒小姐 我写的那个调用的dict有点问题,不能完全验证错误例子,我明天修改一下:kissing_heart:
    亭子青年:@倔强的潇洒小姐 如果你用的我的那个传入的dict,有可能不会报错,因为字典返回是随机的,刚好那个value为list的数据最后一个反回了,有两种方法,第一种,你多运行几次,第二种,修改传入的dict
  • 大婶N72::smile:
    亭子青年:@大婶N72 :heart_eyes::heart_eyes:
    大婶N72:@亭子青年 没有,你写的很好,我也是这样的
    亭子青年:@大婶N72 老师,给建议
  • 939a55559a1b::joy: zan ,bangbangda~
    亭子青年:@夜幕凡尘 谢谢支持么么哒
  • 卜了了:了不起,看孩子还能这样输出,fighting
    卜了了:@亭子青年 :eyes: ,赞
    亭子青年:@卜了了 我怕有一天会成为无用的中年妇女,所以:pensive:

本文标题:python3 递归函数

本文链接:https://www.haomeiwen.com/subject/anvodxtx.html