递归(三)

 

http://www.cnblogs.com/zysbk/archive/2012/11/16/2773819.html  原文

 

 

下面再给大家复习下递归

什么叫递归呢?“和尚讲故事”,就是方法自己调自己,这就是递归。

 

三、方法自己调自己

我们先调下T1方法,让大家看个东西:

 

四、让大家看的东西

 

五、调用堆栈

    用堆栈来监视一下:

一开始调了main方法

再调T1方法

再调T2方法

注意一下顺序,类似于栈结构,先进来在最下面,后进来在最上面。

刚T2方法执行完毕,T2方法没了。

调完之后,从栈里面出来了。

 

再看下我调Say方法。

一开始还是调的main方法,

一直在调Say方法,这个栈越来愈大,直到系统报错。

 

六、溢出,系统报错

  递归里面注意的地方:一定要有终止条件。

  接下来我们看两个例子:

 

七、这个方法的执行结果是什么呢?

如果代码中加上:index++; 又是什么答案呢?

不让用VS测试的时候,自己可以在纸上用纸和笔划一下。

有一些个公司喜欢用这种装逼的题目当面试题的。

答案是4a4b,为什么是这样呢?

我们画图进行分析:

 

八、例一分析图示

对于初学者来讲,这幅图可能还是比较的抽象,所以,建议调试一下。

 

九、例一分析图示二

 

十、例二代码

大家再想想,这段代码的输出结果。考验人类思维极限呦。

下面我们还是画个图就行演示:

 

十一、例二分析图

n在自己的作用域范围内,互不影响。

在做一个程序的时候,能用循环做的,就不要用递归来做。用递归的话,效率极其低下。

想深入研究的朋友可以看下关于:尾递归优化的问题。

在上面两个题目中递归因为栈,才能记住,执行完后面调的方法之后返回去调没有执行完的方法里面的语句。

下面我们看下递归加载和递归删除:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个用Java实现递归级菜单的示例代码: ```java // 获取树状的菜单结构 @Override public List<Menu> findTreeMenu() { List<Menu> menus = findAllMenu(); List<Menu> rootMenus = new ArrayList<>(); // 从最上级菜单开始展示 for (Menu menu : menus) { if (menu.getPid().equals(0L)) { rootMenus.add(menu); } } for (Menu rootMenu : rootMenus) { // 获取最上级菜单的子菜单,子菜单的子菜单也会获取到 List<Menu> child = getChild(rootMenu.getId(), menus); rootMenu.setSubMenu(child); } return rootMenus; } // 获取子菜单方法 private List<Menu> getChild(Long id, List<Menu> menus) { List<Menu> childList = new ArrayList<>(); for (Menu menu : menus) { if (menu.getPid().equals(id)) { childList.add(menu); } } for (Menu menu : childList) { List<Menu> child = getChild(menu.getId(), menus); menu.setSubMenu(child); } if (childList.size() == 0) { return null; } return childList; } // 实体类设计 import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import java.util.List; @Data @TableName("t_menu") @JsonInclude(JsonInclude.Include.NON_NULL) public class Menu { private Long id; private String menuname; private Long pid; private String url; @TableField(exist = false) private List<Menu> subMenu; } ``` 这段代码实现了一个递归级菜单结构。首先,通过`findTreeMenu()`方法获取根菜单列表。然后,通过`getChild()`方法递归获取每个菜单的子菜单,直到没有子菜单为止。最后,将子菜单列表赋值给每个菜单的`subMenu`属性。实体类`Menu`定义了菜单的属性,包括菜单ID、菜单名称、父菜单ID、URL和子菜单列表。 #### 引用[.reference_title] - *1* *2* *3* [java实现级菜单展示(递归)](https://blog.csdn.net/WoAiXiaoMingMing/article/details/121518156)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值