재귀 예제

단일 자체 참조만 포함하는 재귀는 단일 재귀라고 하며 여러 자체 참조를 포함하는 재귀는 다중 재귀라고 합니다. 단일 재귀의 표준 예는 선형 검색과 같은 목록 통과를 포함하거나 요인 함수를 계산하는 반면, 다중 재귀의 표준 예는 깊이 우선 검색과 같은 트리 순회를 포함합니다. 재귀 함수는 프로그래머가 최소한의 코드를 사용하여 효율적인 프로그램을 작성할 수 있기 때문에 컴퓨터 과학에서 일반적입니다. 단점은 제대로 작성되지 않으면 무한 루프 및 기타 예기치 않은 결과가 발생할 수 있다는 것입니다. 예를 들어 위의 예에서 숫자가 0 이하이거나 9보다 크면 함수가 종료됩니다. 적절한 케이스가 실행을 중지하는 함수에 포함되지 않으면 재귀가 영원히 반복되어 프로그램이 충돌하거나 더 심해져 전체 컴퓨터 시스템이 중단됩니다. 재귀의 가장 기본적인 예와 여기에 제시된 대부분의 예제는 함수가 자신을 호출하는 직접 재귀를 보여 줍니다. 간접 재귀는 함수가 그 자체가 아니라 함수가 호출한 다른 함수(직접 또는 간접적으로)에 의해 호출될 때 발생합니다. 예를 들어 f가 f를 호출하는 경우, 즉 직접 재귀이지만 f가 f를 호출하는 g를 호출하면 f. 세 개 이상의 함수 체인의 간접 재귀가 가능합니다. 예를 들어 함수 1 은 함수 2, 함수 2 호출 함수 3, 함수 3 호출 함수 1을 다시 호출합니다. 재귀에 대한 재귀 코딩 연습에 대한 퀴즈: 재귀 재귀 연습 문제에 대한 모든 문서 솔루션에 대한 모든 문서는 파일 시스템의 디렉터리 구조와 관련된 모든 것에 대해 어떻게 설명합니다. 파일을 재귀적으로 찾고, 파일을 삭제하고, 디렉토리를 만드는 등의 재귀 알고리즘은 재귀 알고리즘으로 대체할 수 있습니다.

[20]. 재귀 알고리즘을 대체하는 한 가지 방법은 스택 메모리 대신 힙 메모리를 사용하여 시뮬레이션하는 것입니다. [21] 대안은 전적으로 비재귀 방법을 기반으로 대체 알고리즘을 개발하는 것입니다. [22] 예를 들어, Rich Salz의 와일드매트 알고리즘과 같은 와일드카드 일치를 위한 재귀 알고리즘[23]은 한때 일반적이었습니다. 와일드카드 알고리즘과 일치하는 Krauss와 같은 동일한 목적을 위한 재귀 알고리즘은 재귀의 단점을 피하기 위해 개발되었으며[24] 테스트 수집 및 프로파일링 성능과 같은 기술에 따라 점차적으로 개선되었습니다. [25] 자신과 유사한 작은 부품을 포함하는 것들의 좋은 예: 다중 재귀는 때때로 단일 재귀로 변환될 수 있습니다(원하는 경우 반복으로 변환). 예를 들어 Fibonacci 시퀀스를 순진하게 계산하는 것은 여러 반복이지만 각 값에는 두 개의 이전 값이 필요하므로 두 개의 연속값을 매개 변수로 전달하여 단일 재귀로 계산할 수 있습니다. 이것은 더 자연스럽게 코어커션으로 구성되며, 초기 값에서 구축되고, 각 단계의 연속적인 값에서 추적됩니다. 보다 정교한 예제는 여러 번의 재귀가 아닌 반복적인 트리 순회를 허용하는 스레드된 이진 트리를 사용하는 것입니다.

재귀 문제는 추적해야 하는 이전 상태 때문에 본질적으로 재귀적입니다. 한 가지 예는 깊이 우선 검색에서와 같이 트리 순회입니다. 재귀 및 반복 메서드가 모두 사용되지만[19] 목록의 목록 통과 및 선형 검색과 대조되는 데, 이는 독창적인 재귀적이며 따라서 자연스럽게 반복되는 방법입니다. 다른 예로는 Quicksort와 같은 분할 및 정복 알고리즘과 Ackermann 함수와 같은 함수가 있습니다. 이러한 모든 알고리즘은 명시적 스택의 도움으로 반복적으로 구현할 수 있지만 스택 관리에 관련된 프로그래머의 노력과 결과 프로그램의 복잡성은 반복 솔루션의 장점보다 큽니다. 재귀 알고리즘은 반복되는 함수 호출 및 반환의 오버헤드로 인해 작은 데이터에 비효율적입니다.