java 递归 尾递归_递归和尾递归
C允许一个函数调用其本身,这种调用过程被称作递归(recursion)。
最简单的递归形式是把递归调用语句放在函数结尾即恰在return语句之前。这种形式被称作尾递归或者结尾递归,因为递归调用出现在函数尾部。由于为递归的作用相当于一条循环语句,所以它是最简单的递归形式。
递归中必须包含可以终止递归调用的语句!
递归的有点在于为某些编程问题提供了最简单的方法,而缺点是一些递归算法会很快耗尽计算机的内存资源。同时,使用递归的程序难于阅读和维护
咨询了一下专家,确实对于“尾递归”的情况,也就是说函数体中用到的变量不需要栈保存,gcc
-O2是可以进行优化的,会将其展开成循环,但如果递归函数中有分支就不行,比如路径遍历的实现。有分支就要保存条件变量,就需要压栈,这种情况就展不
开。实际编码中绝大多数都是这种情况。
/*
列出指定目录下文件或者文件夹,包含子目录中的内容。
也就是列出指定目录下所有内容。
因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。
在列出过程中出现的还是目录的话,还可以再次调用本功能。
也就是函数自身调用自身。
这种表现形式,或者编程手法,称为递归。
递归要注意:
1,限定条件。
2,要注意递归的次数。尽量避免内存溢出。
*/
import java.io.*;
class FileDemo3
{
public static void main(String[] args)
{
File dir = new File("d:\\testdir");
//showDir(dir,0);
//toBin(6);
//int n = getSum(8000);
//System.out.println("n="+n);
System.out.println(dir.delete());
}
public static String getLevel(int level)
{
StringBuilder sb = new StringBuilder();
sb.append("|--");
for(int x=0; x
{
//sb.append("|--");
sb.insert(0,"| ");
}
return sb.toString();
}
public static void showDir(File dir,int level)
{
System.out.println(getLevel(level)+dir.getName());
level++;
File[] files = dir.listFiles();
for(int x=0; x
{
if(files[x].isDirectory())
showDir(files[x],level);
else
System.out.println(getLevel(level)+files[x]);
}
}
public static int getSum(int n)
{
if(n==1)
return 1;
return n+getSum(n-1);
}
public static void toBin(int num)
{
if(num>0)
{
toBin(num/2);
System.out.println(num%2);
}
}
//无法结束的递归,成了循环
public static void method()
{
method();
}
}
部门递归工具类
package cn.itcast.oa.util;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import cn.itcast.oa.domain.Department;
public class DepartmentUtils {
/**
* 遍历部门树,把所有的部门遍历出来放到同一个集合中返回,并且其中所有部门的名称都修改了,以表示层次。
*
* @param topList 所有顶级部门作为种子parent==null
* @return
*/
public static List getAllDepartments(List topList) {
List list = new ArrayList();
walkDepartmentTreeList(topList, "┣", list);
return list;
}
/**
* 遍历部门树,把遍历出的部门信息放到指定的集合中
*
* @param topList
*/
private static void walkDepartmentTreeList(Collection topList, String prefix, List list) {
for (Department top : topList) {
// 顶点
Department copy = new Department(); // 使用副本,因为原对象在Session中
copy.setId(top.getId());
copy.setName(prefix + top.getName());
list.add(copy); // 把副本添加到同一个集合中
// 子树
walkDepartmentTreeList(top.getChildren(), " " + prefix, list); // 使用全角的空格
}
}
}
java 递归 尾递归_递归和尾递归相关推荐
- 递归 尾递归_递归,递归,递归
递归 尾递归 by Michael Olorunnisola 通过Michael Olorunnisola 递归,递归,递归 (Recursion, Recursion, Recursion) Bef ...
- rnn 递归神经网络_递归神经网络rnn的简单解释
rnn 递归神经网络 Recurrent neural network is a type of neural network used to deal specifically with seque ...
- 递归函数非递归化_递归神秘化
递归函数非递归化 by Sachin Malhotra 由Sachin Malhotra 递归神秘化 (Recursion Demystified) In order to understand re ...
- 递归 尾递归_什么是尾递归?
递归 尾递归 Here you will learn about what is tail recursion with example. 在这里,您将通过示例了解什么是尾递归. Tail recur ...
- java 递归 时间复杂度_递归到底是怎么实现的?它的时间复杂度怎么算?
递归到底是个啥? 常听见的一句话就是:自己调用自己. 按照这个说法,写个简单的递归自己推导一下的确可以,但是总是有点绕,推着推着自己把自己陷进去了. 递归函数运行时,实际上会进行一个压栈(思考栈的特点 ...
- java中数学归纳法_递归设计与数学归纳法
递归是程序设计中常用到的一种简单易懂的方法,在很多场合下,利用递归可以大量减少代码量. 递归往往能体现设计者头脑的聪慧,简单的递归函数省去了大段大段的代码,让人叹服不已.那么,递归的设计又有怎样的固定 ...
- foreach jdk8 递归_[Java 8] (8) Lambda表达式对递归的优化(上) - 使用尾递归 .
递归优化 很多算法都依赖于递归,典型的比如分治法(Divide-and-Conquer).但是普通的递归算法在处理规模较大的问题时,常常会出现StackOverflowError.处理这个问题,我们可 ...
- java递归优化_在Java中谈尾递归--尾递归和垃圾回收的比较
我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...
- python递归和循环的区别_递归与伪递归区别,Python 实现递归与尾递归
递归函数在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函 数.(1) 递归就是在过程或函数里调用自身.(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出 ...
最新文章
- python有参装饰器 多个装饰器装饰一个
- javascript基础入门_javascript基础入门学习第一篇
- 怎么给当前点击的a标签添加一个样式(跳转页面后)
- Dynamic Routing-中科院西交旷视(孙剑团队)提出用于语义分割的动态路由网络,精确感知多尺度目标,代码已开源!...
- Cocos2d-x之MenuItem
- python快速入门及进阶
- timesat数据如何读取_CMPR软件安装教程和如何转换XRD格式
- 那些年我们感到不可思议的数据恢复
- gis 数据框裁剪_【更新84篇】地理数据科学技术文章合集,欢迎大家点赞、在看、转发三连!...
- 微信小程序后端系统CMS开发笔记--04
- Unity UGUI坐标和世界坐标转化
- ctypes 指针类型 byref pointer POINTER
- select函数使用方法
- 深度学习之迁移学习介绍与使用
- springboot+shiro+jwt实现登录+权限验证
- SWUST OJ 971求二叉树的深度
- SpringMVC 参数映射与文件上传
- gta5的服务器状态,Gta5OL一直处于加载过程中,你可能遇到了这些问题
- 『小众摄影』01 期 :网红重庆•千年古镇磁器口
- 如何用计算机测摄像头信号,如何使用ping命令测试网络摄像头连通性?这篇文章告诉你...
热门文章
- mybatis启动报错Result Maps collection already contains value for xxx
- ubuntu16.04 添加或删除PPA源
- OptaPlanner-车间调度个人心得-matlab
- IRF学习笔记-配置
- dnf跨四服务器什么时候修复,DNF:跨四大区服务器炸了,数据回档导致多少玩家错过了毕业装备...
- 激光SLAM导航系列(三)Costmap(代价地图)(上)
- 剪辑视频哪个好用 简单好上手的剪辑视频软件推荐
- 骨传导耳机真的不伤耳吗、不入耳骨传导耳机推荐
- 初探Turtlebot2
- python entry 文本框只能输入数字 限定数字