递归函数
递归函数:在函数的内部,可以调用其他的函数,如果一个函数在内部调用自身本身,这个函数就是递归函数.
递归调用:一个函数调用自身,成为递归函数
使用递归解决问题的思路:
- 1.写出临界条件
- 2.找这一次和上一次的关系
- 3.假设当前函数已经能用,调用自身计算上一次的结果,再求出本次的结果
使用递归的时候考虑的问题:
- 1.效率问题
- 2.递归栈溢出的问题
使用递归函数需要注意防止栈溢出,在计算机中函数是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,就会增加一层栈帧,每当函数返回,栈就会减一层栈帧,栈的大小是有限制的,所以当调用的次数过多的时候,会导致栈溢出
因此,通常开发过程中不建议使用递归.
递归函数的优点是定义简单,逻辑清晰,理论上所有的递归函数都可以写成循环的方式,但是循环的逻辑不如递归清晰.
需求:计算n! = 1x2x3x4x…x(n-1)xn
# 关系: n!= (n-1)!xn
def fact(n):
#临界条件
if n==1:
return 1
#返回本次的调用结果
return n*fact(n-1)
求斐波那契数列:1,1,2,3,5,8,13,21,34,55,89…
需求:报一个数,直接获取这个位置上的数值
斐波那契数列:
1、1、2、3、5、8、13、21、34、……
n=1 f(1) = 1
n=2 f(2) = 1
n=3 f(3) = f(1)+f(3)
...
f(n) = f(n-1)+f(n-2)
#关系 第n个位置上的数值=(n-1)+(n-2)
#临界值 第一个位置和第二个位置的值为1
def func1(n):
if n==1 or n==2:
#临界值
return 1
else:
#返回本次调用的结果
return func1(n-1) + func1(n-2)
练习 从控制台输入输入一个数,递归求和.
1+2+3+..+n
n = 1 f(1) = 1
...
f(n-1) = f(n-2)+(n-1)
f(n) = f(n-1)+n
def func(n):
if n == 1:
return 1
else:
return func(n-1)+n
print(func(99))