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

    补充:

    汉诺塔递归

  • 相关阅读:
    时间管理(二):时间管理的六项基本原则
    时间管理(一): 达成目标需重视时间管理
    oracle 工作机制 如何工作的
    如何快速彻底删除 svn checkout出来的文件夹
    win7 安装oracle11g注意事项
    eclipse findbugs does not match outer scope rule: MutexSchedulingRule encounter a pro
    oracle ora12154 无法解析连接字符串
    oracle 动态执行表不可访问 异常处理
    log4j配置
    linux 永久 修改 主机名 ip
  • 原文地址:https://www.cnblogs.com/doble-bern/p/5981631.html
Copyright © 2011-2022 走看看