doble_bern

导航

 

递归 

 

引入 递归的表现形式 

下面是四个函数,互相调用返回结果 

# 引入 递归的表现形式

def f1():
    return '1'


def f2():
    r = f1()
    return r


def f3():
    r = f2()
    return r


def f4():
    r = f3()
    return r

result = f4()
print(result)
# 最后输出结果 1

除了依次调用其他函数,函数也可以调用自己

下面的f1()函数一直在调用自己,相当于一个死循环,python内部有机制,当递归调用到一定数量的时候就会报错停止调用了。 

1 def f1():
2     f1()
3 
4 f1() 
5 
6 # 报错: RecursionError: maximum recursion depth exceeded

经典的递归用法有斐波那契数列: 

 1 # 递归的典型应用,斐波那契数列
 2 def fib(x, y):
 3 
 4     if x + y > 1000:
 5         return
 6     z = x + y
 7     fib_list.append(z)
 8     fib(y, z)
 9     return fib_list
10 
11 fib_list = [0, 1]
12 result = fib(0, 1)
13 print(result)
14 # 得到结果:[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]

斐波那契数列加上循环的次数限制:

 1 # 执行了10次后斐波那契数列的结果
 2 
 3 def fib_counts(counts, x, y):
 4     if counts == 11:
 5         return fib_list
 6     z = x + y
 7     fib_list.append(z)
 8     r = fib_counts(counts + 1, y, z)
 9     return r
10 
11 fib_list = [0, 1]
12 result = fib_counts(1, 0, 1)
13 print(result)
14 # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

注意:继续调用函数要有一个返回值来return 

课堂失败案例: 

 1 def num(a, b, n):
 2     if n == 10:
 3         return a
 4     c = a + b
 5     num(b, c, n+1)
 6     return a
 7 s = num(0, 1, 1)
 8 print(s)
 9 # 上面的num(b, c, n+1) 没有返回,直接返回了传入的最原始参数a 结果为0
10 # 因为下一次执行的函数拿到数值后要往上一层传递,但是上一层没有接收的地方,等于无用功
11 
12 
13 # 修改成如下即可:
14 def num(a, b, n):
15     if n == 10:
16         return a
17     c = a + b
18     r = num(b, c, n+1)
19     return r
20 
21 s = num(0, 1, 1)
22 print(s)
23 # 结果返回34

补充:

汉诺塔递归

 

posted on 2016-10-20 17:14  doble_bern  阅读(114)  评论(0编辑  收藏  举报