재귀 적 방법의 큰 O를 찾는 마스터 정리를 참조 할 수 있습니다. 위키피디아 문서는 다음과 같습니다. http://en.wikipedia.org/wiki/Master_theorem
트리와 같은 재귀적인 문제를 생각하고 싶습니다. 그런 다음 나무의 각 수준과 필요한 작업량을 고려하십시오. 문제는 일반적으로 루트 무거운 (첫 번째 반복 >> 나머지 트리), 균형 (각 레벨은 동일한 양의 작업), 리프 무거운 (마지막 반복 >> 나머지 트리)의 3 가지 범주로 분류됩니다. 예를 들어
촬영 병합 정렬 :
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))
당신은 차례로 머지 소트의 각 호출 1/2 원래 길이의 2 이상 mergeSorts를 호출하는 것을 볼 수 있습니다. 병합 절차에는 병합되는 값의 수에 비례하여 시간이 걸립니다.
그런 다음 반복 관계는 T (n) = 2 * T (n/2) + O (n)입니다. 두 개는 2 개의 호출에서 나오고 n/2는 각 호출의 절반에 불과합니다. 그러나 각 레벨에는 병합해야 할 요소 n이 동일하므로 각 레벨에서의 일정 작업은 O (n)입니다.
우리는 작업이 고르게 분포되어 있고 깊이가 log_2 (n)이므로 트리의 재귀 함수가 O (n * log (n))라고 가정합니다.
이것은 재귀와 관련이 없으며 큰 O 표기법과 관련이 있습니다. 재귀 적으로 작성할 수 있다면 반복적으로 쓸 수 있습니다. – MStodd
@MStodd 필자는 아닙니다. 반복적으로 이진 트리를 탐색 해보십시오. – Drise
@Drise 스택이 필요할 수도 있지만 가능합니다. 재귀는 호출 스택 내에서 스택을 숨 깁니다. –