递归

点击蓝字“莫名Coder”关注我哟

加个“星标”,每日良时,好文必达!

  递归

递归是很多算法都使用的一种编程方法。

试想一下,你的女朋友给你买了一份礼物,女朋友告诉你礼物就在盒子里面。

这个盒子里面有盒子,而盒子里面套着盒子,礼物就在某个盒子里面。想一想这个问题,再接着往下看。

第一种方法:

  • 1.创建一个要查找的盒子堆;

  • 2.从盒子里面取出一个盒子,在里面找;

  • 3.如果找到的是盒子,将其放到盒子堆中,以便以后在查找;

  • 4.如果找到的是礼物,大功告成;

  • 5.回到第二步

第二种方法:

  • 1.检查盒子中的每样东西

  • 2.如果是盒子,就回到第一步

  • 3.如果是礼物,就大功告成

伪代码实现:

# 第一种
def look_for_gift(box):
    pile = box.make_a_pile_to_look_through()
    while pile is not empty:
        b = pile.grab_a_box()
        for item in b:
            if item.is_a_box():
                pile.append(item)
            elif item.is_a_key():
                print("找到礼物了")

# 第二种
def look_for_gift(box):
    for item in box:
        if item.is_a_box():
            look_for_gift(item)
        elif item.is_a_key():
            print("找到礼物了")

这两种方法作用基本相同,在我看来,第二种更加简洁,处理方式更加清晰。

基线条件和递归条件

由于函数调用自己,如果递归条件出错,那么导致无线循环。因此每个递归函数由两部分:基线条件和递归条件。递归条件指的是函数调用自己,而基线条件指的是函数不再调用自己,从而避免形成无线循环。

众所周知,大家都用过清单或者待办事项。插入待办事项放到清单的最前面,读取事项的时候,只需要读取最上面的那个,将其删除。两种操作:插入和弹出。

调用栈

计算机在内部使用被称为调用栈。定义一个函数:

def greet(name):
    print("hello , " + name + "!")
    greet2(name)
    print("getting ready to say bye")
    bye()

调用greet()函数,在调用另外两个函数,示例:

def greet2(name):
    print("how are you," + name + "?")

def bye():
    print("ok bye!")

假设我们调用了greet("luck"),计算机中首先为该函数分配一块内存,使用内存,变量name被设置为luck,这就需要存储到内存中。

当你调用函数时,计算机将变量的值存储于内存中,接下来打印hello luck再调用greet2()函数,同样,计算机也为这个函数分配一块内存。

注意

  • 递归指的是调用自己的函数

  • 递归函数有基线条件和递归条件

  • 栈有两种操作,压入和弹出

  • 所有函数调用都进入调用栈

---END---

莫名Coder

关于 Python 都在这里

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值