前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Recursion - 递归

Recursion - 递归

作者头像
caoqi95
发布2019-03-27 17:53:02
5710
发布2019-03-27 17:53:02
举报
文章被收录于专栏:caoqi95的记录日志

递归

在家里找到一个铁盒子,但是你不知道钥匙在哪里。祖母告诉你:钥匙在一个大盒子里,这个大盒子里都是盒子,盒子里面还是盒子,钥匙就在某个盒子中。下面有两种方法可以找出钥匙。

  • 第一种: (1) 创建一个要查找的盒子堆 (2) 从盒子堆取出一个盒子,在里面找 (3) 如果找到的是盒子,就将其加入盒子堆中,以便之后再查找 (4) 如果找到的是钥匙,则大功告成 (5) 回到第二步

第一种方法使用的是 while循环:只要盒子堆不空,就从中取一个盒子,并在其中仔细查找。伪代码如下:

代码语言:javascript
复制
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!")
  • 第二种: (1) 检查盒子中的每样东西 (2) 如果是盒子,就回到第一步 (3) 如果是钥匙,就大功告成

第二种使用的是递归方法,伪代码如下:

代码语言:javascript
复制
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!") 

函数调用自己本身的方法称为递归

  • 两种方法对比: 以上两种方法的作用相同,但是第二种更为清晰。而第一种的while循环方法在某些情况下,性能上会更好。第二种只是让方法更清晰,并没有性能上的优势。就像下图中的回答,循环可能会带来性能上的提升,递归会给程序员带来提升(更容易理解),使用哪种,取决于哪个对于你来说更重要。

基线条件和递归条件

由于递归函数调用自己,因此写代码的时候很可能会出错,让程序陷入死循环。例如,下面的倒计时函数,运行的话会没完没了:

代码语言:javascript
复制
def countdown(i):
    print(i)
    countdown(i-1)

所以编写递归函数的时候,必须定义好递归的条件。每个递归函数都包含两部分:基线条件(base case)和递归条件(recursive case)。递归条件指的是函数调用自己,而基线条件指的是函数不再调用自己。 使用基线条件和递归条件修改上面代码:

代码语言:javascript
复制
def countdown(i):
    print(i)
    if i <= 1:  # base case 
        return
    else:      # recursive case
        countdown(i-1)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.08.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 递归
  • 基线条件和递归条件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档