Ich habe eine Template-BST-Klasse erstellt und ich habe GetEnumerator implementiert, aber ich bin wirklich nicht zufrieden mit dem, was getan wurde.Ausbeute in Rekursion bst
so vor allem fühlte ich inneren Besuch eine Hilfsfunktion
private IEnumerable<Node<T>> innerVisit(Node<T> root)
{
if(root== null)
yield break;
if (root.Left != null)
{
var l = innerVisit(root.Left);
foreach (var item in l)
yield return item;
}
yield return root;
if (root.Right != null)
{
var r = innerVisit(root.Right);
foreach (var item in r)
yield return item;
}
}
brauchte ich konnte wirklich die sie wiederholenden Code nicht mögen, aber keine richtige Lösung, um es , klar die Schleife zu wiederholen ist unrein finden, aber auch Ich habe das Gefühl, dass es unter einer Funktion, die in diese hineinspringen würde, zu begraben wäre, gelinde gesagt eine schlechte Praxis zu sein. Irgendwelche Vorschläge, wie man das richtig macht?
auch die Umsetzung vervollständigen ich geschrieben habe
public IEnumerator<Node<T>> GetEnumerator()
{
var res = innerVisit(_root);
foreach (var item in res)
yield return item;
}
aber auch das fühlt sich schlecht und eher ein Hack sicherzustellen, dass es innerhalb foreach-Schleife arbeiten und usw.
Diese effektiv den gleichen Code wie der OP schrieb, gerade jetzt ein Einzeiler. Sie haben die Bedenken des OP nicht angesprochen, sondern nur dargelegt, was eigentlich eine andere Syntax ist, um das zu tun, was sie zuerst getan haben. – Enigmativity
"Ich mag den Wiederholungscode wirklich nicht, konnte aber keine richtige Lösung dafür finden", dieser Code wiederholt nicht die gesamte Ertragsrückgabe und die foreach-Schleifen. Er bat nicht um einen anderen Algorithmus, er wollte einfach nicht den gleichen Foreach- und Yield-Code überall wiederholen. – YuvShap
Jeder Aufruf von 'InnerVisit' ruft effektiv 'Ausbeute' auf, wenn es Elemente sind - es tut so oft wie der OP-Code. Und du nennst 'InnerVisit' auf der linken Seite und' InnerVisit' auf der rechten Seite - das ist Code wiederholt. Dies ist effektiv der gleiche Code wie das OP. Sie sollten versuchen zu erklären, wie Ihre Lösung anders ist. – Enigmativity