재귀:
프로그래밍 약관을 재귀적 기능으로 정의될 수 있는 루틴을 통화 자체를 직접 또는 간접적으로.
재귀 알고리즘을 사용하면 특정 문제를 아주 쉽게 해결할 수 있습니다. 하노이 타워(TOH)는 그러한 프로그래밍 운동 중 하나입니다. TOH 에 대한 반복 알고리즘을 작성하려고합니다. 또한 모든 재귀 프로그램은 반복 메서드를 사용하여 작성할 수 있습니다(Lipschutz 의 데이터 구조 참조).
수학적으로 재귀는 몇 가지 퍼즐을 쉽게 푸는 데 도움이됩니다.,
예를 들어,일상적인 면접 질문
에서의 파티 N 는 사람들,각 사람은 흔들어 그녀의 손이 서로 다른 사람에게만 적용됩니다. 총 얼마나 많은 손 흔들림이 일어날 것입니까?
솔루션:
그래프,재귀 등 다양한 방법으로 해결할 수 있습니다. 재귀 적으로 해결할 수있는 방법을 살펴 보겠습니다.
N 사람이 있습니다. 각 사람은 한 번만 서로 악수합니다. N 번째 사람을 고려할 때,(들)그는(N-1)사람과 악수해야합니다. 이제 문제는(N-1)사람의 작은 인스턴스로 감소했다. TN 을 총 쉐이크 핸드로 가정하면 재귀 적으로 공식화 할 수 있습니다.,
TN=(N-1)+TN-1
재귀 적으로 해결하면 N(N-1)/2 로 평가할 수있는 산술 계열이 생성됩니다.
운동:N 커플의 파티에서는 한 성별(남성 또는 여성)만 모든 사람과 악수를 할 수 있습니다. 얼마나 많은 악수가 일어날 것입니까?
일반적으로 재귀 프로그램은 빈약 한 시간 복잡성을 초래합니다. 예는 피보나치 시리즈입니다. 시간 복잡도를 계산하는 n 피보나치 번호를 사용하여 재귀는 약 1.6n. 그것은 동일한 컴퓨터의 거의 60%를 위해 더 많은 시간 다음 피보나치 번호. 재귀 피보나치 알고리즘은 하위 문제를 겹쳤습니다., 이러한 겹쳐진 알고리즘을 개선하기 위해 동적 프로그래밍과 같은 다른 기술이 있습니다.
그러나 몇 가지 알고리즘을(예를 들어 병합 정렬,빠른 종류,등등…)결과에 최적의 시간 복잡도를 사용하여 재귀.
기본 사례:
재귀 함수의 중요한 요구 사항 중 하나는 종료 지점 또는 기본 사례입니다. 모든 재귀 프로그램에는 함수가 종료되는지 확인하기 위해 기본 케이스가 있어야합니다. 기본 사례가 누락되면 예기치 않은 동작이 발생합니다.,
쓰는 다른 방법을 재귀적 기능을
함수 호출하는 자:(직접적인 방법)
우리의 대부분은 알고 있어야의 두 가지 방법을 쓰는 재귀 프로그램입니다. 아래에 주어진 것은 하노이 코드의 타워입니다. 그것은 직접 호출의 예입니다.
출력:
Move the disk 1 from S to DMove the disk 2 from S to AMove the disk 1 from D to AMove the disk 3 from S to DMove the disk 1 from A to SMove the disk 2 from A to DMove the disk 1 from S to D
시간 복잡도의 TOH 계산할 수 있습으로 공식화됩니다.
우리가 필요한 이동하는 첫 번째 N-1 의 디스크에서 원하는 보조와에서 보조를 대상,즉 첫 번째 N-1 디스크는 필요한 두 가지 이동합니다. 소스에서 대상으로 마지막 디스크를 한 번 더 이동합니다., 수학적으로 재귀 적으로 정의 될 수있다.
MN=2MN-1+1.
우리는 기하 급수적 인 위의 재귀 관계(2N-1)를 쉽게 풀 수 있습니다.
상호 함수 호출을 사용한 재귀:(간접 방식)
간접 호출. 적어도 pratical 이지만 함수는 inturn 이 이전 함수를 호출하는 다른 함수를 호출 할 수 있습니다. 이 경우 두 기능 모두 기본 케이스를 가져야합니다.
방어 프로그래밍:
우리는 우리를 결합 할 수 있습 방어 코딩 기술과 재귀한 우아한 기능의 응용 프로그램입니다., 일반적으로 재귀 프로그래밍은 비행 제어,상태 모니터링 등과 같은 안전에 중요한 응용 프로그램에서는 허용되지 않습니다. 그러나,하나를 사용할 수 있는 정적 계산 기법을 피하는 조절되지 않는 전화(지 않은 안전에서 중요한 시스템을 사용할 수 있습니다 부드러운 실시간 시스템).
callDepth 깊이는 함수 스택 프레임 크기와 최대 스택 크기에 따라 다릅니다.
함수 포인터를 사용한 재귀:(간접 방식)
재귀는 함수 포인터로도 구현할 수 있습니다. 예는 POSIX 불만 시스템의 신호 처리기입니다., 핸들러가 호출되는 핸들러로 인해 동일한 이벤트를 트리거하는 원인이되면 함수가 다시 입력됩니다.