c允许称为递归(recursion )的函数调用其本身。
最简单的递归类型是将递归调用语句放在函数的末尾,即紧接在return语句之前。 这种格式称为尾部递归或尾部递归,因为递归调用出现在函数的末尾。 这是最简单的递归格式,因为递归的作用相当于循环语句。
递归必须包括可以结束递归调用的语句。
递归是为一些编程问题提供最简单的方法,但一些递归算法具有很快就会耗尽计算机内存资源的缺点。 此外,使用递归程序会使读取和维护变得困难
如果询问专家,确实是“末尾递归”的情况,也就是说函数体中使用的变量不需要堆栈保存,gcc
-O2可以优化并展开到循环中,但递归函数中存在分支(例如实现路径遍历)是不行的。 如果有分支,就必须保存条件变量,需要堆栈,此时不能展开
开车。 在实际编码中大部分都是这种情况。
/*
列出包含子目录内容的指定目录下的文件或文件夹。
这意味着列出指定目录下的所有内容。
目录中还有目录,所以使用列出目录功能的同一函数就可以了。
在一览显示中还显示目录的情况下,也可以再次调用本功能。
也就是说,函数本身就是调用自己。
这种表示或编程方法称为递归。
递归注意:
1、限定条件。
2、注意递归的次数。 尽量避免内存溢出。
*/
importjava.io.*;
classFileDemo3
{
publicstaticvoidmain (string [ ] args ) )。
{
filedir=new file (d : ((testdir ) );
//showdir(dir,0 );
//tobin(6);
//intn=getsum(8000;
//system.out.println('n='n );
system.out.println(dir.delete );
}
公共字符串级别(int level ) )。
{
stringbuilder sb=new stringbuilder (;
sb.append((|--);
for(intx=0; x
{
//sb.append(|--);
sb.insert(0,'|';
}
returnsb.toString (;
}
publicstaticvoidshowdir (filedir,intlevel ) )。
{
system.out.println(getlevel ) dir.getName );
标签;
File[]files=dir.listFiles (;
for(intx=0; x
{
files [ x ].is directory ()
showdir(files[x],level );
else
system.out.println(getlevel ) files[x];
}
}
公共统计信息(intn ) )。
{
if(n==1) )。
返回1;
Returnngetsum(n-1;
}
公共声明(intnum ) )。
{
是if (数字0 )
{
tobin(num/2;
system.out.println(num%2);
}
}
//未结束的递归,变成了循环
publicstaticvoidmethod (
{
method (;
}
}
部门递归工具类
packagecn.itcast.oa.util;
importjava.util.ArrayList;
importjava.util.Collection;
importjava.util.List;
import cn.itcast.OA.domain.department;
publicclassDepartmentUtils{
//*
*遍历部门树,遍历所有部门并放回同一集合中,其中所有部门的名称已更改为表示层次结构。
*
*@paramtopList所有顶级部门都将parent==null作为种子
*@return
*/
publicstaticlistgetalldepartments (list toplist ) {
Listlist=newArrayList (;
walkdepartmenttreelist () toplist、()、list;
返回列表;
}
//*
*遍历部门树,并将已遍历的部门信息放置到指定集合中
*
*@paramtopList
*/
privatestaticvoidwalkdepartmenttreelist (collection toplist,Stringprefix,Listlist ) {
部署顶级:拓扑列表{
//顶点
Departmentcopy=newDepartment (; //使用复印。 因为原始对象位于会话中
copy.setid(top.getid ) );
copy.setname(prefixtop.getname ) );
list.add(copy; //将副本添加到同一集合
//子树
wlkdepartmenttreelist (top.get children )、' ' prefix、list ); //使用全角空格
}
}
}