为了账号安全,请及时绑定邮箱和手机立即绑定

递归:先递进,再回归

标签:
Java Python 算法

虽然高端的知识要用最朴素有趣的方式来表达才更容易让人接受但有些专业的内容却不能有半点马虎必须严肃对待后续的内容会在谈笑中慢慢向严谨转变在轻松中缓缓传递认真的态度也会在日复一日的坚持中不知不觉完成积累

言归正传之前在编程逻辑中提到过常见的编程逻辑也就是控制流有三种分别是顺序分支和循环在那也留了一个小悬念这哥仨其实还有两个小兄弟没露面因为这俩出镜不多所以见过的人不多但他俩的名字可能很多人都知道一个叫递归」,一个叫回调」。

和前面仨不同他们俩在逻辑上比较绕属于烧脑的那种

先从递归说起

网上很多文章都讲过递归——出现最多就是斐波那契数列公式是F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)。或者用更直白的话来表达就是:「先递进再回归」。可以参看下面的图来理解

https://img1.sycdn.imooc.com//633233520001040a06090441.jpg

 

这么看的话就一目了然了

如果用代码来表示就是


// 递归计算斐波那契数列
public static int calc(final int n) {
   // 特殊情况,分开讨论
   if (n == 1 || n == 2) {
      return 1;
   }
   if (n > 2) {
      // 递归调用
      return calc(n - 1) + calc(n - 2);
   }

   // 如果输入错误的n,一律返回-1
   return -1;
}


如果只是计算数学公式那递归就简单得有点无聊了

递归真正经典的应用在于读取计算机文件目录下面是示例代码


/**
 * 以递归方式列出所有文件
 *
 * @param dir   指定要进行递归操作的目录
 * @param spance 层级区分符号,顶层是空字符串
 */
public static void listFile(File dir, String spance) {
   // 列出所有的子文件
   File[] files = dir.listFiles();
   for (File file : files) {
      // 如果是文件,则输出文件名字
      if (file.isFile()) {
         System.out.println(spance + file.getName());
         // 如果是文件夹,则输出文件夹的名字,并递归遍历该文件夹
      } else if (file.isDirectory()) {
         System.out.println(spance + file.getName());
         // 递归遍历
         listFile(file, "|--" + spance);
      }
   }
}


其实递归的作用挺大的只是平常编程中用的不多而已除了遍历显示目录还有两个最常用的场景就是在电商网站中地区多级联动和展示角色所拥有的菜单就像下面展示的那样

地区级联菜单XXXX号为例):

https://img1.sycdn.imooc.com//633233870001e7b805430397.jpg

 

 

https://img1.sycdn.imooc.com//6332338e00012c3905420399.jpg


 

角色拥有菜单XXXX为例):

https://img1.sycdn.imooc.com//63323396000131c305780574.jpg

 

可以看到并掌握的规律是只要是有这种层级关系的都可以用递归来实现

至于怎么实现可以留给感兴趣的童鞋自己玩玩不过给点小提示是递归的数据结构一定要设计好不然没法实现

关于数据结构该如何设计以及数据库表该如何设计这个后面都会讲到的

 


点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消