zoukankan      html  css  js  c++  java
  • Python之递归函数

    一、初始递归

    递归函数:在一个函数里调用这个函数本身

    递归的最大深度:998

    正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是Python为了杜绝此类现象,强制得将递归层数控制在了997

    拿什么来证明这个“998理论”呢?这里我们可以做一个实验:

    def foo(n):
        print(n)
        n += 1
        foo(n)
    foo(1)

    由此我们可以看出,未报错之前能看到的最大数字就是998。当然了,997是Python为了我们程序的内存优化所设定的一个默认值,我们当然还可以通过一些手段去修改它:

    import sys
    print(sys.setrecursionlimit(100000))
    View Code

    我们可以通过这种方式来修改递归的最大深度,刚刚我们将Python允许的递归深度设置为了10w,至于实际可用到达的深度就取决于计算机的性能了。不过我们还是不推荐修改这个默认的递归深度,因为如果用997层递归都没有解决的问题要么是不适合使用递归来解决要么是你代码写得太烂。

    看到这里,你可能会觉得递归不是那么好的东西,不如while True好用呢!然而,江湖上流传这样一句话叫做:人理解循环,神理解递归。所有你可别小看了递归函数,很多人被拦在大神的门槛外这么多年,就是因为,没能领悟递归的真谛。而且之后我们学习的很多算法都会和递归有关系。来吧,只有学会了才有资本嫌弃

    二、递归示例讲解

    这里我们又要举个例子来说明递归能做的事情。

    例一·:

    在你们问我,alex老师多大了?我说我不告诉你,但alex比 egon 大两岁。

    你想知道alex多大,你是不是还得去问egon?egon说,我也不告诉你,但我比武sir大两岁。

    你又问武sir,武sir也不告诉你,他说他比太白大两岁。

    那你问太白,太白告诉你,他18了。

    这个时候你是不是就知道了?alex多大?

    1 金鑫 18
    2 武sir 20
    3 egon 22
    4 alex 24

    你为什么能知道的?

    首先,你是不是问alex的年龄,结果又找到egon、武sir、太白,你挨个儿问过去,一直到拿到一个确切的答案,然后顺着这条线再找回来,才得到最终alex的年龄。这个过程已经非常接近递归的思想。我们就来具体的我分析一下,这几个人之间的规律。

    age(4) = age(3) + 2 
    age(3) = age(2) + 2
    age(2) = age(1) + 2
    age(1) = 18

    那这样的情况,我们的函数怎么写呢?

    def age(n):
        if n == 1:
            return 40
        else:
            return age(n-1)+2
    
    print(age(4))
  • 相关阅读:
    (数据科学学习手札21)sklearn.datasets常用功能详解
    (数据科学学习手札20)主成分分析原理推导&Python自编函数实现
    (数据科学学习手札19)R中基本统计分析技巧总结
    (数据科学学习手札18)二次判别分析的原理简介&Python与R实现
    P2633|主席树+dfs序+树链剖分求lca+离散化
    主席树|求区间第k小模板
    树上问题
    数据结构|序列问题与树上问题小结
    珂朵莉树 例题小结
    CF#609E|二分+树状数组
  • 原文地址:https://www.cnblogs.com/Big-Dinosaur/p/10465842.html
Copyright © 2011-2022 走看看