我有一个关于实现递归方法的两种不同方法的优点的问题。我一直遵循版本1的方法,即接受单个Node参数,但最近我遇到了版本2中使用的样式,它接受节点的集合。
考虑下面的Node类,以及2个版本的along方法:
class Node
{
public List<Node> children = new List<Node>();
// other data members
}版本1接受单个节点参数:
Visit(Node n)
{
DoSomethingUsefulWith(n);
foreach (Node child in n.children)
Visit(child);
}版本2接受节点集合:
Visit(List<Node> nodes)
{
foreach (Node n in nodes)
{
DoSomethingUsefulWith(n);
Visit(n.children);
}
}使用一种表单比使用另一种表单在风格上有什么好处吗?选择是否应该仅仅基于您是从单个Node开始还是从一个节点集合开始,即使在这两种情况下使用任何一种方法版本都是微不足道的?
发布于 2010-02-14 06:41:10
我不会实现版本2,总是实现版本1。
版本2基本上是for-each循环中的版本1
如果您以后决定使用一个参数调用该方法,则始终可以重用版本1。
如果只有版本2和一个节点,则必须创建一个虚拟列表才能使用版本1。
我不认为性能在这里是一个真正的问题。这两种方法都有一个(通过引用)参数,它们应该使用大约相同的内存量。
然而,.NET也许能够更好地优化这两者中的一个。分析这两种方法以确保安全。
发布于 2010-02-14 06:42:54
我更喜欢采用单个节点的签名,因为如果我只想对该节点及其子节点执行操作,那么我就不必构造一个人工列表。它很容易在节点列表上使用,而且您只需迭代列表并将其应用于每个节点。
发布于 2010-02-14 06:36:41
您应该在递归函数中传递尽可能少的参数(甚至考虑到专用于您所使用的类型的内存大小)。这是我遵循的一般规则。如果你传递一些大的结构,你可能会耗尽内存。如果你使用的是引用类型,这不是问题。
https://stackoverflow.com/questions/2259348
复制相似问题