首页 > 其他分享 >递归:先递进,再回归

递归:先递进,再回归

时间:2022-11-21 18:09:39浏览次数:37  
标签:return 递归 spance 递进 file calc 回归 dir

您好,我是湘王,这是我的51CTO博客,欢迎您来,欢迎您再来~


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

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

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

先从「递归」说起。

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

递归:先递进,再回归_斐波那契数列



这么看的话,就一目了然了。

如果用代码来表示,就是:

// 递归计算斐波那契数列
public static int calc(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号为例):

递归:先递进,再回归_数据结构_02


递归:先递进,再回归_斐波那契数列_03


角色拥有菜单(以XXXX为例):

递归:先递进,再回归_递归_04


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

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

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





感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~


标签:return,递归,spance,递进,file,calc,回归,dir
From: https://blog.51cto.com/u_15817148/5869262

相关文章

  • 道长的算法笔记:树结构递归模型
    (一)线性结构的递归模型链表是一种天然带有递归性质的结构,当我们想要处理\(Node_A\)为首的链表,我们尝试处理\(Node_B\)为首的链表,然后再单独处理节点\(A\),类似的,......
  • 二叉树交换左右子树递归以及非递归算法
    递归方式基本思想:1、当待处理节点非空时,判断其左右孩子是否不同时为空:若是,转到2、否则分别递归调用左右子树进行操作。2、新建一个辅助结点,执行交换操作。3、递归调用......
  • 递归删除大于30天的旧日志
    /***递归删除大于30天的旧日志*/privatestaticvoiddeleteOldLogFiles(Filedir){if(dir.isDirectory()){File[]files=dir.lis......
  • Leetcode 799.香槟塔:动态规划+递归
    香槟塔:动态规划+递归题目来源:Leetcode22/11/20每日一题:799.香槟塔https://leetcode.cn/problems/champagne-tower我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻......
  • 利用递归求两个数的最大公约数
    #include<stdio.h>inthcf(intn1,intn2);intmain(){intn1,n2;printf("输入两个正整数:");scanf("%d%d",&n1,&n2);printf("%d和%d的最大公约数......
  • 三种回归损失函数
    详细介绍这里,清楚的介绍了三种损失函数。我这里重点记录一下他们的异同,方便自己消化理解。1、对于回归损失函数,通常主要有MSE(均方误差),MAE(平均绝对误差),HuberLoss。其中,Hub......
  • 逆向递归加正向递归,将无规则树 重建成一棵完整的树
    逆向递归加正向递归,将无规则树重建成一棵完整的树背景后台在一个部门树上任意勾选,然后前端需要知道勾选后重新生成的树,没有父级的找上级依次类推。最近递归写的......
  • 82:递归函数_阶乘计算案例
    【操作】使用递归函数计算阶乘(factorial)deffactorial(n):ifn==1:return1returnn*factorial(n-1)foriinrange(1,6):print(i,......
  • 81:递归函数_函数调用内存分析_栈帧的创建
    ###递归函数递归函数指的是:自己调用自己的函数,在函数体内部直接或间接的自己调用自己。递归类似于大家中学数学学习过的“数学归纳法”。每个递归函数必须包含两个部分:1.......
  • 337. 打家劫舍 III ----- 动态规划、递归、剪枝、分类讨论
    小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到......