递归函数
1 # 在讨论递归函数之前,我们先来看这样一个例子 2 def fun1(num1,num2): 3 return num1 + num2 4 5 6 def fun2(num1,num2,f): 7 return f(num1,num2) + f(num1,num2) 8 9 print(fun2(3,5,fun1)) 10 11 # 可以理解为,函数也是一个变量,函数名可以作为一个变量名来处理,作为其他函数的参数,比如fun1 12 # 函数名fun1指向了一块内存,这块内存中存放着fun1的代码块。在调用fun1的时候,程序就根据fun1指向的内存地址找到了相应的代码块,然后执行 13 # 现在,将fun1作为一个参数向fun2传参,实际上与向fun2传入一个变量是一样的 14 # 由上可得,一个函数在执行的时候可以调用另一个函数 15 # 如果调用自身呢?那就是递归函数 16 17 # 举例 18 def func3(n):# 这个函数可以完成阶乘 19 if n == 1: 20 return 1 21 return n*func3(n - 1) 22 23 24 print(func3(5)) # func3(5) = 5*fun3(4) = 5*4*fun3(3) = 5*4*3*fun3(2) = 5*4*3*2*fun3(1) = 5*4*3*2*1 25 26 # 错误的例子 27 def func4(n):# 调用这个函数会给你报错 ==>> maximum recursion depth exceeded in comparison 28 if n == 1: 29 return func4(n)*func4(n-1) 30 return func4(n)*func4(n-1) 31 32 33 print(func4(4))# func4(4) = func4(4)*func4(3) = func4(4)*func4(3)*func4(3)*func4(2) = 34 # func4(4)*func4(3)func4(3)*func4(2)func4(3)*func4(2)func4(2)*func4(1) = ......无限循环 35 36 # 所以,在使用递归函数时,必须有一个明确的结束条件 37 # 此外,需要注意的是,递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的 38 # 每当进入一个函数调用,栈就会加一层栈帧,每当函数返 回,栈就会减一层栈帧。由于栈的大小不是无限的 39 # 所以,递归调用的次数过多,会导致栈溢出
增加一个示例
# 斐波纳契数列 def Fibonacci(n):# 普通函数版 sum1 = 0 sum2 = 1 for i in range(n): if i == 1: sum3 = 1 else: sum3 = sum1 + sum2 sum1 = sum2 sum2 = sum3 print(sum3,end=' ') return sum3 Fibonacci(25) print('\n') def Fibonacci3(n):# 递归函数版 def Fibonacci2(i): if i <= 1: return i return (Fibonacci2(i - 1) + Fibonacci2(i - 2)) for i in range(1,n+1): print(Fibonacci2(i),end=' ') Fibonacci3(25)