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 递归 尾递归_递归和尾递归相关推荐

  1. 递归 尾递归_递归,递归,递归

    递归 尾递归 by Michael Olorunnisola 通过Michael Olorunnisola 递归,递归,递归 (Recursion, Recursion, Recursion) Bef ...

  2. rnn 递归神经网络_递归神经网络rnn的简单解释

    rnn 递归神经网络 Recurrent neural network is a type of neural network used to deal specifically with seque ...

  3. 递归函数非递归化_递归神秘化

    递归函数非递归化 by Sachin Malhotra 由Sachin Malhotra 递归神秘化 (Recursion Demystified) In order to understand re ...

  4. 递归 尾递归_什么是尾递归?

    递归 尾递归 Here you will learn about what is tail recursion with example. 在这里,您将通过示例了解什么是尾递归. Tail recur ...

  5. java 递归 时间复杂度_递归到底是怎么实现的?它的时间复杂度怎么算?

    递归到底是个啥? 常听见的一句话就是:自己调用自己. 按照这个说法,写个简单的递归自己推导一下的确可以,但是总是有点绕,推着推着自己把自己陷进去了. 递归函数运行时,实际上会进行一个压栈(思考栈的特点 ...

  6. java中数学归纳法_递归设计与数学归纳法

    递归是程序设计中常用到的一种简单易懂的方法,在很多场合下,利用递归可以大量减少代码量. 递归往往能体现设计者头脑的聪慧,简单的递归函数省去了大段大段的代码,让人叹服不已.那么,递归的设计又有怎样的固定 ...

  7. foreach jdk8 递归_[Java 8] (8) Lambda表达式对递归的优化(上) - 使用尾递归 .

    递归优化 很多算法都依赖于递归,典型的比如分治法(Divide-and-Conquer).但是普通的递归算法在处理规模较大的问题时,常常会出现StackOverflowError.处理这个问题,我们可 ...

  8. java递归优化_在Java中谈尾递归--尾递归和垃圾回收的比较

    我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...

  9. python递归和循环的区别_递归与伪递归区别,Python 实现递归与尾递归

    递归函数在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函 数.(1) 递归就是在过程或函数里调用自身.(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出 ...

最新文章

  1. python有参装饰器 多个装饰器装饰一个
  2. javascript基础入门_javascript基础入门学习第一篇
  3. 怎么给当前点击的a标签添加一个样式(跳转页面后)
  4. Dynamic Routing-中科院西交旷视(孙剑团队)提出用于语义分割的动态路由网络,精确感知多尺度目标,代码已开源!...
  5. Cocos2d-x之MenuItem
  6. python快速入门及进阶
  7. timesat数据如何读取_CMPR软件安装教程和如何转换XRD格式
  8. 那些年我们感到不可思议的数据恢复
  9. gis 数据框裁剪_【更新84篇】地理数据科学技术文章合集,欢迎大家点赞、在看、转发三连!...
  10. 微信小程序后端系统CMS开发笔记--04
  11. Unity UGUI坐标和世界坐标转化
  12. ctypes 指针类型 byref pointer POINTER
  13. select函数使用方法
  14. 深度学习之迁移学习介绍与使用
  15. springboot+shiro+jwt实现登录+权限验证
  16. SWUST OJ 971求二叉树的深度
  17. SpringMVC 参数映射与文件上传
  18. gta5的服务器状态,Gta5OL一直处于加载过程中,你可能遇到了这些问题
  19. 『小众摄影』01 期 :网红重庆•千年古镇磁器口
  20. 如何用计算机测摄像头信号,如何使用ping命令测试网络摄像头连通性?这篇文章告诉你...

热门文章

  1. mybatis启动报错Result Maps collection already contains value for xxx
  2. ubuntu16.04 添加或删除PPA源
  3. OptaPlanner-车间调度个人心得-matlab
  4. IRF学习笔记-配置
  5. dnf跨四服务器什么时候修复,DNF:跨四大区服务器炸了,数据回档导致多少玩家错过了毕业装备...
  6. 激光SLAM导航系列(三)Costmap(代价地图)(上)
  7. 剪辑视频哪个好用 简单好上手的剪辑视频软件推荐
  8. 骨传导耳机真的不伤耳吗、不入耳骨传导耳机推荐
  9. 初探Turtlebot2
  10. python entry 文本框只能输入数字 限定数字