递归浅谈

在经典上看到有朋友对"递归"不甚了解,于是乎发表一下自己的拙见 说得不对的地方还请多多指教. 所谓递归 就是一个函数在执行的过程中不断地调用它本身 递归在某种程度上来说是一个知道"死亡周期的死循环" 举个简单的例子 现在要写一个方法,该方法要计算一个目录占用的磁盘空间 这个时候就是要计算出该目录下的文件及所有子目录下的文件大小之和 假设要计算D:\test目录的大小 该目录下有 1.cs/2.cs/3.cs/4.cs/5.cs 及4个子目录 下面是我写的方法 [code] public static long GetDirectoryLength(string dirPath) { if (!Directory.Exists(dirPath)) return 0; long len = 0; DirectoryInfo di = new DirectoryInfo(dirPath); foreach (FileInfo fi in di.GetFiles()) { len += fi.Length; } DirectoryInfo[] dis = di.GetDirectories(); if (dis.Length > 0) { for (int i = 0; i < dis.Length; i++) { len += GetDirectoryLength(dis[i].FullName); } } return len; } [/code] 该方法中需要传递一个绝对的磁盘路径 这里我们要传入的是"D:\test\" 我们来看看这个代码的执行情况 执行第一次的时候: if (!Directory.Exists(dirPath)) return 0; long len = 0; DirectoryInfo di = new DirectoryInfo(dirPath); foreach (FileInfo fi in di.GetFiles()) { len += fi.Length; } 变量dirPath为"D:\test\" 上面代码会计算出test目录下的5个.cs文件的大小 那余下的目录怎么办?所以,在遍历所有目录的时候,再调用GetDirectoryLength方法,把当前遍历到的目录作为参数传递 if (dis.Length > 0) { for (int i = 0; i < dis.Length; i++) { [b]len += GetDirectoryLength(dis[i].FullName);[/b] } } 这就是递归,递归一般用在有隶属关系的数据之中 如常见的Tree、计算一个数的阶乘 [code] public static long test(int num) { long result = num; if (num < 0) return -1; if (num == 0) return 1; result = result * (test(num - 1)); return result; } [/code] 上面的代码是计算一个数的阶乘,比较简单,细细体会就能看懂,也就知道什么是递归、如何写递归了。

1 Responses

  1. ccc July 10 2006 , 22:05
    [em1]
    #1
对不起,评论已关闭