zoukankan      html  css  js  c++  java
  • 【Python全栈笔记】08 [模块二] 20 Oct 递归 -*** 待补充

    递归 

    引入 递归的表现形式 

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

    # 引入 递归的表现形式
    
    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

    补充:

    汉诺塔递归

  • 相关阅读:
    虚拟化、云计算与超融合的简单总结
    期货量化总结与思考
    易盛内外通用版交易API转websocket
    门诊叫号系统系列-1.语音叫号 .net c#
    六线顺上黑马选股和切割线选股法该如何操作?
    我的总结--强势股的短线战法精髓
    MACD头肩顶/底 = 驱动五浪
    有效突破的三三原则
    5日均线--攻击线
    10日均线--操盘线
  • 原文地址:https://www.cnblogs.com/doble-bern/p/5981631.html
Copyright © 2011-2022 走看看