有时我发现自己在编写尾递归函数。我一直在寻找高低,我发现.NET框架中有尾递归,但我不确定在什么情况下我可以,在什么情况下我不能有效地使用尾递归。例如,我有一棵简单的树,我们称之为
public class Tree
{
public Tree parent = null;
public Tree(Tree parent)
{
this.parent = parent;
this.children = new List<Tree>();
}
public List<Tree> children {get; private set;}
public Tree root
{
get
{
return this.parent == null ? this : parent.root;
}
}
}
对于根属性,编译器会发出一个循环吗?它会发出.tail吗?抖动会尊重 .tail 吗?不会发生任何幻想,算法会递归运行吗?最重要的是,我应该将其重写为迭代吗?