zoukankan      html  css  js  c++  java
  • 《算法图解》第三章笔记与课后练习_递归

    软件环境:Python 3.7.0b4

    一、基线条件和递归条件

    由于递归函数调用自己,因此编写这样的函数时很容易出错,进而导致无限循环。例如:

    def countdown(i):
      print(i)
      countdown(i-1)
    
    countdown(5) # 测试数据

    当我们编写递归函数时,必须告诉它何时停止递归。所以,每个递归函数都有两部分:

    • 基线条件(base case):函数调用自己。
    • 递归条件(recursice case):函数不再调用自己,从而避免无限循环。
    def countdown(i):
      print(i)
      # 基线条件
      if i <= 0:
        return
      # 递归条件
      else:
        countdown(i-1)
    
    countdown(5) # 测试数据

    二、调用栈

    计算机在内部使用被称为调用栈的栈。

    def greet2(name):
        print("how are you, ", name, "?")
    
    def bye():
        print("ok bye!")
    
    def greet(name):
        print("hello, ", name, "!")
        greet2(name)
        print("getting ready to say bye...")
        bye()
    
    greet("adit")

    调用过程如下:

    1. 假设调用greet("adit"),计算机将首先为该函数调用分配一块内存;
    2. 在这个内存中,变量name被设置为adit,并存储进这个内存中;
    3. 接下来,打印 hello,adit !,再调用greet2(name),此时的name=adit。同样,计算机也会为这个greet2函数调用分配一块内存;
    4. 计算机使用一个栈来表示这些内存块,其中第二个内存块位于第一个内存块上面。当打印 how are you,adit?,然后从函数调用返回,栈顶的内存块被弹出;
    5. 现在栈顶的内存块是函数greet,这意味刚才执行完greet2函数后返回到了函数greet里,因此当调用函数greet2时,函数greet只执行了一部分。所以我们要记住一个重要的概念:调用另一个函数时,当前函数暂停并处于未完成状态
    6. 该函数的所有变量的值都还在内存中,执行完函数greet2后,返回到函数greet中,并从离开的地方开始继续往下执行打印 getting ready to say bye...,再调用函数bye。
    7. 在栈顶添加函数bye的内存块,然后 打印 ok bye !,并从这个函数返回。
    8. 现在再次回到了函数greet,由于没有往下执行的操作,所以直接从函数greet返回。这个栈用于存储多个函数的变量,被称为调用栈。

    3.1:可获得的信息有

    1. 调用了函数greet,并将参数name的值指定为maggle;
    2. 函数greet调用了函数greet2,并将参数name的值指定为maggle;
    3. 此时函数greet处于未完成状态;
    4. 当前调用的函数为greet2;
    5. 这个函数执行完毕后,函数greet将接着执行。

    三、递归调用栈

    def fact(x):
      if x == 1:
        return 1
      else:
        return x * fact(x-1)

    使用栈的方式表述如下:

      

    3.1:栈将不断地扩大。因为每个程序可使用的调用栈空间有限,程序用完这些空间后,将因栈的溢出而终止。

    四、小结

    • 递归指的是调用自己的函数。
    • 每个递归函数都有两个条件:基线条件和递归条件。
    • 栈有两种操作:压入和弹出。
    • 所有函数调用都进入调用栈。
    • 调用栈可能非常长,所以讲占用计算机大量的内存。
  • 相关阅读:
    POJ 2184 Cow Exhibition (01背包变形)(或者搜索)
    ACM-ICPC如何起步[转]
    查看centos中的用户和用户组和修改密码
    CentOS7安装并配置PostgreSQL
    在Win10下,python3和python2同时安装并解决pip共存问题
    Django-用户-组-权限
    linux系统磁盘满了,怎么解决?
    DRF (Django REST framework) 中的路由Routers
    DRF (Django REST framework) 中的视图扩展类
    DRF (Django REST framework) 中的视图类
  • 原文地址:https://www.cnblogs.com/OctoptusLian/p/9028196.html
Copyright © 2011-2022 走看看