本篇主要介绍Python中函数的递归,还是从三个方面了解:什么是递归;递归有什么好处;递归的具体用法是什么样的;
一、什么是递归?
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。记住哦->在函数内部调用其他函数不是函数的嵌套,而在函数内部定义子函数才是函数的嵌套。
递归的特性:
1、递归函数必须有一个明确的结束条件。
2、每进入更深一层的递归时,问题规模相对于上一次递归都应减少
3、相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
4、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
先看一个例子,一个关于实现叠加的两种方法的例子:
import sys
#通过循环来实现叠加
def sum1(n):
'''
to n,The sum function
'''
sum = 0
for i in range(1,n + 1):
sum += i
return sum
#通过函数的递归来实现叠加
def sum2(n):
'''
to n,The sum function
'''
if n > 0:
return n + sum2(n - 1) #调用函数自身
else:
return 0
print("循环叠加-->",sum1(100))
print("递归叠加-->",sum2(100))
#两者实现的效果均是:5050
从上述例子中可以看出,两者都可以实现叠加的效果。那么后者相对前者有什么优缺点呢?
二、递归函数有啥优缺点?
递归函数的优点:定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
递归函数的缺点:使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
把上面的递归求和函数的参数改成1000就导致栈溢出!
当然也可以通过尾递归来对递归的栈溢出进行优化。这里就不详细介绍了。请参考:http://www.open-open.com/lib/view/open1480494663229.html
三、通过实例来介绍函数递归:
下面我们通过一个问路的例子,更好的理解递归:
def calc(n): #定义函数calc
print(n) #打印参数
if int(n/2): #将参数除2,再得到的结果再进行计算
return calc(int(n/2)) #调用函数自身
print('->',n) #打印函数
calc(10) #初始参数为10
#输出结果为:
'''
10
5
2
1
-> 1
'''
转载自https://www.cnblogs.com/littlefivebolg/articles/9113918.html