递归函数

 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)

 

posted @ 2017-10-30 12:45  Nathaniel-J  阅读(157)  评论(0编辑  收藏  举报