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的,所以才会出现对称的那种结果。