递归

一、递归

  说到递归,我不知道该用怎么样词汇去描述它,这说明我对它的理解还是处在朦胧阶段,我想这需要一个过程,今天我们简单来认识下这个让人又爱又恨的家伙吧~

 

  假如你在祖母的阁楼里发现了一个带锁的神秘宝箱,祖母告诉你,钥匙很可能在这个盒子里。

  于是你查看这个盒子,发现,这个盒子里有盒子,而盒子里的盒子又有盒子。钥匙就在其中的某个盒子里,为了找到钥匙,你该怎么做呢?

  方案一:

    1、创建一个要查找的盒子堆;(就是把这个大盒子里你能看到的盒子全部拿出来)

    2、从盒子堆中取出一个盒子,在里面找;(开始检查每一个盒子)

    3、如果打开这个盒子发现里面还是一个盒子,就将其放入第1步的盒子堆中,以便后续再查找;

       如果是钥匙,则大功告成;

    5、回到第2步继续查找。

  方案二:

    1、检查盒子中的每样东西;

    2、如何是盒子,就回到第一步;

    3、如果是钥匙,大功告成!

  在你看来,哪种方法更容易?

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

  

  第二种方法使用递归,函数自己调自己,伪代码如下:

  

  两种方法作用相同,但明显第二种方法看着更舒服,这或许就是递归最大的优势。递归只是让解决方案看着更清晰,并没有性能上的优势。实际上,在某些情况下,循环的性能更好。所以借助Leigh Caldwell的那句话:“如果使用循环,程序的性能可能更高;如果使用递归,程序的可读性更容易理解”。

 

二、基线条件和递归条件

  因为递归是自己调自己,所以很容易造成死循环,那必须得设置条件告诉它何时停止递归。正因为如此,每个递归都有两部分构成:

  1、基线条件:函数不再调用自己;

  2、递归条件:函数调用自己。

 

三、栈

  栈又名堆栈,它是一种受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端称为栈顶,相对另一端称为栈底。

  向栈插入新元素,又称为进栈、入栈或压栈,把一个元素从栈顶删除,又称为出栈或退栈。

  说完栈,我们再说一个重量级的人物——调用栈(Call stack),它是深入理解递归的一个重要的概念!!!

  调用栈是计算机科学中存储有关正在运行的子程序的消息的栈。计算机在内部使用调用栈的栈,我们看看计算机是如何来使用调用栈的,一代代码如下:

    

  调用栈代码刨析:

  当你调用函数greet('Lucy')时,计算机为greet函数分配了一块内存;

  然后将变量name设置为Lucy,并保存在内存中;(每当你调用函数时,计算机都是如此将函数调用涉及到的所有变量的值存储到内存中)

  接下来计算机打印出hello,Lucy;

  然后又调用函数greet2('Lucy'),同样,系统此时也为greet2函数调用分配了一块内存;(计算机使用一个栈来表示这些内存块,其中第二个内存块位于第一个内存块上面)

  此时计算机打印how are you,Lucy?然后从函数greet2返回,此时,栈顶的内存(greet2的内存)被弹出(出栈)。

  现在,栈顶的内存块是函数greet的,这意味着你已经返回到greet函数中。此处有一个重要的概念:调用另一个函数时,当前函数暂停并处于未完成状态

  然后计算机又调用函数bye,把函数bye内存块压入到栈中,待bye函数执行完毕,再弹出栈,最终又回到greet函数,因为没有什么事情可做,最后从greet函数返回。

  在这个过程中,这个栈用于存储多个函数的变量,被称为调用栈。

  使用栈虽然很方便,但也要付出代价,因为每个函数的调用都会占用一定的内存,这样将导致栈很高,这意味着计算机需要大量的内存来存储这些函数调用的信息,如果超出系统内存,这将导致栈溢出。对应的解决方案有两种:

  1、使用循环来替代递归;

  2、使用尾递归,这是一个高级递归主题,有兴趣自己研究下,另外不是所有的语言都支持尾递归。

转载于:https://www.cnblogs.com/zsvslx/p/10564649.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本火锅店点餐系统采用Java语言和Vue技术,框架采用SSM,搭配Mysql数据库,运行在Idea里,采用小程序模式。本火锅店点餐系统提供管理员、用户两种角色的服务。总的功能包括菜品的查询、菜品的购买、餐桌预定和订单管理。本系统可以帮助管理员更新菜品信息和管理订单信息,帮助用户实现在线的点餐方式,并可以实现餐桌预定。本系统采用成熟技术开发可以完成点餐管理的相关工作。 本系统的功能围绕用户、管理员两种权限设计。根据不同权限的不同需求设计出更符合用户要求的功能。本系统管理员主要负责审核管理用户,发布分享新的菜品,审核用户的订餐信息和餐桌预定信息等,用户可以对需要的菜品进行购买、预定餐桌等。用户可以管理个人资料、查询菜品、在线点餐和预定餐桌、管理订单等,用户的个人资料是由管理员添加用户资料时产生,用户的订单内容由用户在购买菜品时产生,用户预定信息由用户在预定餐桌操作时产生。 本系统的功能设计为管理员、用户两部分。管理员为菜品管理、菜品分类管理、用户管理、订单管理等,用户的功能为查询菜品,在线点餐、预定餐桌、管理个人信息等。 管理员负责用户信息的删除和管理,用户的姓名和手机号都可以由管理员在此功能里看到。管理员可以对菜品的信息进行管理、审核。本功能可以实现菜品的定时更新和审核管理。本功能包括查询餐桌,也可以发布新的餐桌信息。管理员可以查询已预定的餐桌,并进行审核。管理员可以管理公告和系统的轮播图,可以安排活动。管理员可以对个人的资料进行修改和管理,管理员还可以在本功能里修改密码。管理员可以查询用户的订单,并完成菜品的安排。 当用户登录进系统后可以修改自己的资料,可以使自己信息的保持正确性。还可以修改密码。用户可以浏览所有的菜品,可以查看详细的菜品内容,也可以进行菜品的点餐。在本功能里用户可以进行点餐。用户可以浏览没有预定出去的餐桌,选择合适的餐桌可以进行预定。用户可以管理购物车里的菜品。用户可以管理自己的订单,在订单管理界面里也可以进行查询操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值