java中的递归

本文介绍了递归的基本概念,并通过几个实例展示了递归算法的应用,包括十进制转二进制、求和、求最大公约数及汉诺塔问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所谓递归,是指程序调用自身,当然,递归不会无休止地调用下去,它必然有一个出口,当满足条件时程序也就结束了,不然的话,那就是死循环了。
看下面这个类,有几个递归方法,看了之后肯定会对你学习递归很有帮助的。
/**递归类Recursion的定义*/
public class Recursion{
      //递归方法DecimalToBinary,把一个十进制数转换成二进制数
      public static void DecimalToBinary(int num){
             if(num ==0){        //当num=0时,循环结束
                    return;
             }else{
                    DecimalToBinary(num/2);  //调用递归方法
                    System.out.print (num%2);
             }
             }
      
      //递归方法sum,求1+2+...+100 的求和
      public static int sum(int num){
             if(num > 0){
                    return num + sum(num-1); //调用递归方法
             }else{
                    return0;      //当num=0时,循环结束
             }
             
      }    
      
      //递归方法yueshu,求两个数的最大公约数   ,用两个数的绝对值与这两个数较小的那个一直比较,直到相等为止。               
      public static void yueshu(int num1,int num2){
             if(num1 == num2){
                    System.out.println(num1);  //num1=num2时,结束
             }
             else{
                    yueshu(abs(num1-num2),min(num1,num2)); //调用递归方法
             }
                                  
      }
      
      //求两个数绝对值
      public static int abs(int num){
             return num>0 ? num : -num;
      }
      
      
     //求两个数较小者                                    
      public static int min(int num1,int num2){
             return num1 > num2 ? num2 :num1;
      }
      
      //递归方法hanon,求瀚诺塔函数
      public static void hanon(int n,char a,char b,char c){
      if(n == 1){
                    move(1,a,c);//最后一种情况是,把A柱子上盘子移到C柱子上。
                    return;
             }
      hanon(n-1,a,c,b);  //递归,把n-1个盘子从A 盘上借助C盘移到B盘上
      move(n,a,c);//调用move()方法
      hanon(n-1,b,a,c);//递归,把把n-1个盘子从B盘上借助A盘移到C盘上
      }
      
      public static void move(int n,char a,char c){
                    System.out.println(n+":"+a+"-->"+c);//打印移动盘子情况
             }
             
             
      //主函数main
      public static void main(String [] args){
             
             yueshu(12,8);              //求最大公约数
             hanon(3,'A','B','C');      //求瀚诺算法
             System.out.println(sum(100));//求和
             DecimalToBinary(103);//十进制转换二进制
             
      }
      
}
<think>好的,我现在需要回答用户关于在Java中使用递归方法获取菜单的示例。首先,我得回忆一下递归的基本概念和它在处理树形结构数据中的应用。递归是一种通过调用自身来解决问题的方法,特别适合处理像菜单这种具有层级结构的数据。 用户提到了几个引用,其中提到通过递归遍历父菜单的子菜单来获取所有子菜单。我需要确保示例代码正确展示这一过程。首先,可能需要定义一个菜单类,包含id、名称、父id和子菜单列表。然后,构建一个方法,通常是递归的,来将平铺的菜单列表转换为树形结构。 接下来,我需要考虑如何递归地构建菜单树。通常的做法是遍历所有菜单项,找到根节点(即父id为0或null的项),然后为每个根节点递归查找其子节点。这需要编写一个方法,接收父id和所有菜单列表,返回该父节点的子菜单列表,并为每个子菜单继续查找其子菜单。 另外,用户提供的引用中提到了printMenuTree方法,这是一个递归方法,用于打印菜单树结构。这可能涉及到缩进处理,以显示层级关系。在示例代码中,可能需要展示如何从构建好的菜单树进行遍历和打印。 需要注意的地方包括递归的终止条件,即当某个菜单项没有子菜单时停止递归。此外,还要处理可能的循环引用或无效父id的情况,但示例中可能暂时忽略这些错误处理,以保持代码简洁。 最后,要确保代码符合Java语法,并且注释清晰,方便用户理解每一步的操作。同时,根据用户要求,生成相关问题,可能涉及递归的原理、优化方法、应用场景等。</think>以下是如何在Java中使用递归实现菜单树获取的详细说明和示例代码: --- ### Java递归获取菜单树实现步骤 1. **定义菜单实体类** ```java public class Menu { private Integer id; private String name; private Integer parentId; private List<Menu> children = new ArrayList<>(); // 构造函数/getter/setter } ``` 2. **递归构建树结构** ```java public class MenuService { // 原始数据示例 List<Menu> allMenus = Arrays.asList( new Menu(1, "系统管理", 0), new Menu(2, "用户管理", 1), new Menu(3, "角色管理", 1), new Menu(4, "日志管理", 1), new Menu(5, "操作日志", 4) ); /** * 构建完整菜单树 */ public List<Menu> buildMenuTree() { return buildSubMenu(0); // 从根节点开始构建 } /** * 递归构建子菜单 * @param parentId 当前父节点ID */ private List<Menu> buildSubMenu(Integer parentId) { List<Menu> tree = new ArrayList<>(); for (Menu menu : allMenus) { if (menu.getParentId().equals(parentId)) { menu.setChildren(buildSubMenu(menu.getId())); // 递归获取子节点 tree.add(menu); } } return tree; } } ``` 3. **树形结构输出示例** ```java public void printMenuTree(List<Menu> menus, int level) { for (Menu menu : menus) { System.out.println(" ".repeat(level) + "├─ " + menu.getName()); if (!menu.getChildren().isEmpty()) { printMenuTree(menu.getChildren(), level + 1); // 递归打印子节点 } } } // 输出结果: // ├─ 系统管理 // ├─ 用户管理 // ├─ 角色管理 // ├─ 日志管理 // ├─ 操作日志 ``` **关键点说明:** 1. 递归终止条件:当没有找到对应parentId的子菜单时,自动停止递归 2. 时间复杂度:$O(n^2)$,可通过建立父ID索引优化到$O(n)$[^4] 3. 内存消耗:每个菜单对象都会持有子菜单列表引用 --- ### 递归过程示意图 $$ \begin{array}{ccc} \text{根节点} & \rightarrow & \text{查找子节点} \\ & \downarrow & \text{递归调用} \\ \text{子节点} & \rightarrow & \text{查找孙节点} \\ \end{array} $$ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值