递归在编程过程中用到,它的定义是在一个方法内部,对于自身进行调用,直到调用到最小值满足条件
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
一个例子
public class DiGui{
public static void main(String[] args){
System.out.println(method(5));
}
public static int method (int n){
if(n == 1){
return 1;
}else
{
return n*method(n-1);
}
}
}
图解
函数一直调用自身,直到返回确定的值,然后一层层向上返回。
递归的的缺点:
递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
应用场景:
在进行树状结构的文件操作的时候,会经常用到递归,例如删除某一个文件及子文件,使用递归删除
public static void DeleteFolder(string dir)
{
foreach (string d in Directory.GetFileSystemEntries(dir))
{
//判断路径是否存在
if (File.Exists(d))
{
//文件夹下没有子文件
FileInfo fi = new FileInfo(d);
//去除文件夹的只读属性
if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1)
fi.Attributes = FileAttributes.Normal;
File.Delete(d);//直接删除其中的文件
}
else
{
//文件夹下有子文件
DirectoryInfo d1 = new DirectoryInfo(d);
if (d1.GetFiles().Length != 0)
{
DeleteFolder(d1.FullName);递归删除子文件夹
}
Directory.Delete(d);
}
}
}
总结:一般树状结构的都可以使用递归查询,比如 查询地区,树状的菜单等等,递归比普通的算法耗内存,谨慎使用。