Sie könnten sich auf den Hauptsatz zum Finden des großen O rekursiver Methoden beziehen. Hier ist der Wikipedia-Artikel: http://en.wikipedia.org/wiki/Master_theorem
Sie möchten an ein rekursives Problem wie ein Baum denken. Dann betrachte jede Ebene des Baumes und die Menge an Arbeit, die benötigt wird. Die Probleme werden im Allgemeinen in 3 Kategorien unterteilt: Wurzel schwer (erste Iteration >> Rest des Baumes), ausgewogen (jede Ebene hat die gleiche Menge an Arbeit), Blatt schwer (letzte Iteration >> Rest des Baumes). siehe
define mergeSort(list toSort):
if(length of toSort <= 1):
return toSort
list left = toSort from [0, length of toSort/2)
list right = toSort from [length of toSort/2, length of toSort)
merge(mergeSort(left), mergeSort(right))
können Sie, dass jeder Aufruf von MergeSort ruft wiederum 2 weitere mergeSorts von 1/2 der Originallänge:
Taking Mergesort als Beispiel. Wir wissen, dass die Zusammenführungsprozedur Zeit benötigt, die proportional zur Anzahl der Werte ist, die zusammengeführt werden.
Die Rekursionsbeziehung ist dann T (n) = 2 · T (n/2) + O (n). Die zwei kommen von den 2 Anrufen und die n/2 von jedem Anruf haben nur die Hälfte der Anzahl der Elemente. Jedoch gibt es auf jeder Ebene die gleiche Anzahl von Elementen n, die zusammengeführt werden müssen, so dass die konstante Arbeit auf jeder Ebene O (n) ist.
Wir wissen, dass die Arbeit gleichmäßig verteilt ist (O (n) jede Tiefe) und der Baum log_2 (n) tief ist, also ist der große O der rekursiven Funktion O (n * log (n)).
Das hat wirklich wenig mit Rekursion zu tun, und alles hat mit großer O-Notation zu tun. Wenn Sie es rekursiv schreiben können, können Sie es iterativ schreiben – MStodd
@MStodd Nicht unbedingt. Versuchen Sie, einen Binärbaum iterativ zu durchlaufen. – Drise
@Drise Sie würden einen Stapel benötigen, aber es ist möglich. Rekursion blendet den Stack nur im Call-Stack aus. –