Python 递归函数详解

递归函数的概念:

直接或间接的调用自身的函数,称为递归函数。

每调用一次自身,相当于复制一份该函数,只不过参数有变化,参数的变化,就是重要的结束条件

下面是一个递归函数的实例:

#coding=utf-8
def
calc(n): print(n) if int(n/2) > 0: calc(int(n/2)) else: print('------') print(n) calc(10)

打印结果:

10
5
2
1
------
1
2
5
10

第一次接触递归函数的人,都会被它调用本身而搞得晕头转向,而且看上面的函数调用,以为得到的结果会是:

10
5
2
1
------
1

为什么以为会得出上面的结果呢?因为都把调用函数本身之后的代码给忘记了,就是else之后的python 代码。

实际此递归函数输出的是以下结果:

10
5
2
1
------
1
2
5
10

相信大家看到这里都有点蒙,我也一样,我第一次看到这个递归函数时,只能理解到第一个结果。那是因为,大部分人在做事情的时候,中断第一件事,被安排去做第二件事的时候,就会把第一件事后续的事情给忘记,如果在做第二件事的时候,又被中断,被安排去做第三件事,就会把第一件、第二件要做的后续的事情给忘记......,这就是不理解递归函数的原因。

     下面我把此递归函数做了一个分解,希望能够帮到大家。 

     详解递归函数,当调用递归函数calc(10)时,执行过程如下:

#coding=utf-8
def calc(10):
    print(10)
    if int(10/2) > 0:
    
        def calc(5):
            print(5)
            if int(5/2) > 0:

                def calc(2):
                    print(2)
                    if int(2/2) > 0:

                        def calc(1):
                            print(1)
                            print('------')
                            print(1)
                    print(2)
            print(5)
    print(10)

在调用函数本身时,它之后的代码并没有结束,而是在等待条件为False 时,再接着执行之后的代码,同一个颜色的print()语句等待对应颜色的函数。

 

如果看到这里还不理解,那请看下面过程

#coding=utf-8
def calc(10):

    print(10)

    if int(10/2) > 0:
        calc(int(10/2))
    else:
        print('------')

    print(10)
    
    |
    |
    v
def calc(5):

    print(5)

    if int(5/2) > 0:
        calc(int(5/2))
    else:
        print('------')

    print(5)
    
    |
    |
    v
def calc(2):

    print(2)

    if int(2/2) > 0:
        calc(int(2/2))
    else:
        print('------')

    print(2)
    
    |
    |
    v
def calc(1):

    print(1)

    if int(1/2) > 0:      #此时条件不成立,走else
        calc(int(1/2))
    else:
        print('------')

    print(1)

可以看到,每次条件成立都会调用函数本身,那函数本身最后是有一个print的,所以才会出现对称的那种结果。

 

posted @ 2019-04-16 14:59  香菜哥哥  阅读(1536)  评论(0编辑  收藏  举报