zoukankan      html  css  js  c++  java
  • Python基础篇【第八篇】:剖析递归函数

    递归函数

    如果函数中包含了对其自身的调用,该函数就是递归函数!

    先介绍一下斐波那契数列:斐波那契数列成为黄金分割数列,表现形式0、1、1、2、3、5、8、13、21、34、.......

    可以看出前两个的数的和等于第三个数0 + 1 = 1,1 + 1 = 2 , 1 + 2 = 3 ......

    通过斐波那契数列剖析递归函数:

     1 #!/usr/bin/env python3
     2 #通过斐波那契数列详细剖析递归函数
     3 #0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657
     4 
     5 def f1(depth, a1, a2):
     6     print("第%s次循环:"%depth,a1,a2)
     7     
     8     if depth == 3:
     9         
    10         return a1,a2
    11     
    12     a3 = a1 + a2
    13     r = f1(depth +1, a2, a3)
    14     return r
    15 
    16 ret = f1(1,0,1)
    17 print(ret)
    18 
    19 '''
    20 代码分析:
    21 depth:为了明确分析每一步的操作和状态
    22 a1:从初始目的要得到斐波那契数
    23 a2:从斐波那契数列中可以看到前两个数的和等于第三个数
    24 程序开始从上往下依次执行:
    25     1.看到函数时首先把整个函数放到内存中
    26     2.执行到下一步看到带着实参(1,0,1)的函数名字(f1)赋值到了一个变量上(ret),执行函数
    27     3.再继续执行的时候函数中的结果给输出出来
    28     执行函数的流程:
    29 
    30         1.实参传入到放在内存的函数相对应的形参中去(depth = 1, a1 = 0, a2 = 1)
    31             def f1(depth = 1, a1 = 0, a2 = 1):
    32 
    33                 2.%s站位符,%depth此刻等于1, a1 = 0, a2 = 1
    34                 print("第%s次循环:"%depth,a1,a2) = 第1次循环: 0 1
    35 
    36                 3.在此设置一个条件,只让它循环3次,然后返回循环3次的结果,并会把最后一次的返回值拿出来(先拿在手里)
    37                 if depth == 3:
    38                     return a1,a2
    39                       3次的结果:0 1 (第一次)
    40                                1 1 (第二次)
    41                                1 2 (第三次)
    42 
    43                 4.赋值一个变量a3让其等于a1加a2的和,第一次时a1 = 0, a2 = 1 所以a3 = 1
    44                 a3 = a1 + a2 ===> 1 = 0  + 1
    45 
    46                 5.当程序执行到这时看到一个变量r,变量的内容可以看到f1这个名字,这个是函数的名字,在这的意思就是调用其函数本身,这就是递归了!
    47                 f1(depth +1, a2, a3)这段代码的意思就是调用自身,把depth +1, a2, a3传入到函数本身的参数中去.
    48                 所以当前r = f1(depth +1, a2, a3) ===> r = f1(2, 1, 1)
    49                 得到这个r这个变量的值的时候往下执行看到'return r',return返回值会把刚刚r变量刚刚得到的值当做函数的实参,重新传入到函数的形参中里.
    50                 这也是第二次循环开始的地方!所以第二次循环开始的方式就是:
    51 
    52                        开始                                                             第一次
    53 
    54                 def f1(depth, a1, a2):                                  def f1(1, 0, 1):
    55                     print("第%s次循环:"%depth,a1,a2)                         print("第%s次循环:"%depth,0,1)
    56                     if depth == 1:                                          if depth == 1:          #循环一次,满足条件
    57                         return a1,a2                                            return 0,1          #第一次返回的值
    58                     a3 = a1 + a2                                                1 = 0 + 1
    59                     r = f1(depth +1, a2, a3)                                    r = f1(2, 1, 1)     #第二次开始的地方
    60                     return r                                                    return r            #把值返回到函数中
    61 
    62                 ret = f1(1,0,1)                                         ret = f1(1,0,1)
    63                 print(ret)                                              print(ret)
    64 
    65                     第二次
    66 
    67                 def f1(2, 1, 1):
    68                     print("第%s次循环:"%depth,1,1)
    69                     if depth == 2:      #第二次循,满足条件
    70                         return 1,1      #第二次返回的值
    71                     2 = 1 + 1                                                   第N次...
    72                     r = f1(3, 1, 2)     #第三次开始的地方
    73                     return r            #把值传入到函数中
    74 
    75                 ret = f1(1,0,1)
    76                 print(ret)
    77 '''

    以上得到的结果:

    1 /Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/zk/PycharmProjects/old_boy/day07/递归函数.py
    2 第1次循环: 0 1
    3 第2次循环: 1 1
    4 第3次循环: 1 2
    5 (1, 2)
    6 
    7 Process finished with exit code 0
  • 相关阅读:
    注册以及密码验证
    轮播图,渐显,可以左右点击
    节点移动
    数据持久化
    Objective-C Autorelease Pool 的实现原理(转)
    iOS应用架构谈 view层的组织和调用方案(转)
    iOS 开源项目
    iOS开发系列--无限循环的图片浏览器
    富文本常用封装(NSAttributedString浅析)(转)
    OS开发UI篇—ios应用数据存储方式(XML属性列表-plist)(转)
  • 原文地址:https://www.cnblogs.com/allan-king/p/5486888.html
Copyright © 2011-2022 走看看