【发布时间】:2012-03-21 07:28:09
【问题描述】:
我想我以前知道怎么做,但我好像忘记了。
我有一个递归算法来删除目录树中的所有空目录:
static bool DeleteDirectoriesRecursive(string path)
{
var remove = true;
foreach (var dir in System.IO.Directory.GetDirectories(path))
{
remove &= DeleteDirectoriesRecursive(dir);
}
if (remove &= (System.IO.Directory.GetFiles(path).Length == 0))
System.IO.Directory.Delete(path);
return remove;
}
我试图从该算法中消除递归,而不是“修复”该算法(即the similar question 不使用remove 变量,但我想保留它)。
我已经启动了一个新函数,使用Stack<> 类,但是我想不出一个好的方法来返回基本路径并执行子目录确定的操作。我想解开非尾递归需要更多的努力。
【问题讨论】:
-
为什么要用另一个(你的)堆栈(IL 堆栈)替换?你能从中得到什么?
-
知识。没有人说我会在生产代码中这样做。
-
@zmbq - 我就是这么想的。这实际上是一个非常好的递归使用,因为它使用调用堆栈来爬取一棵树。尝试用自己的堆栈做同样的事情只会使代码变得更长、更难理解,并且也不会提供任何性能优势。
-
@SteveWortham:递归的大多数用途都很好,但有时您必须使用显式堆栈来实现它,因为溢出 IL 堆栈是致命的。
-
@Gabe - 好点。目录结构必须非常庞大,您才会遇到 StackOverflowException,但我想这是可能的。
标签: c# .net algorithm recursion stack