《算法图解》学习笔记—第3章 递归

3.1 递归介绍

盒子中找钥匙
在这里插入图片描述
解决方案一:while 循环
在这里插入图片描述

def look_for_key(main_box):
    pile = main_box.make_a_pile_to_look_through()
    while pile is not empty:
        box = pile.grab_a_box()
        for item in box:
            if item.is_a_box():
               pile.append(item)
            elif item.is_a_key():
               print "found the key!"

解决方案二:递归——函数调用自己
在这里插入图片描述

def look_for_key(box):
    for item in box:
        if item.is_a_box():
           look_for_key(item)
        elif item.is_a_key():
           print "found the key!"

3.2 基线条件和递归条件

编写递归函数时,必须告诉它何时停止递归。正因为如此,每个递归函数都有两部分:基线条件(base case)和递归条件(recursive case)。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。

3.3 栈

栈是一种简单的数据结构。有两种操作:压入(插入)和弹出(删除并读取)。
在这里插入图片描述

调用栈

栈用于存储多个函数的变量时,被称为调用栈(call stack)。
每当你调用函数时,计算机会将函数调用涉及的所有变量的值存储到内存中。计算机使用一个栈来表示这些内存块,其中第二个内存块位于第一个内存块上面。当调用另一个函数时,当前函数暂停并处于未完成状态。
在这里插入图片描述

递归调用栈

下面是计算阶乘的递归函数。

def fact(x):
    if x == 1:
       return 1
    else:
       return x * fact(x-1)
  • 栈顶的方框指出了当前执行到了什么地方。
  • 每个fact调用都有自己的x变量。在一个函数调用中不能访问另一个 x x x的变量。

在这里插入图片描述
使用栈虽然很方便,但是也要付出代价:存储详尽的信息可能占用大量的内存。每个函数调用都要占用一定的内存,如果栈很高,就意味着计算机存储了大量函数调用的信息。解决方法:1.重新编写代码,转而使用循环。2.使用尾递归

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值