Иногда я нахожу, что пишу хвостовые рекурсивные функции. Я искал высоко и низко, и я обнаружил, что в платформе .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;
}
}
}
для свойства root, будет ли компилятор испускать цикл? он испустит .tail? Будет ли дрожание уважать .tail? ничего не случится, и будет ли алгоритм просто рекурсивно работать? Самое главное, следует ли переписать это как итеративный?