기금넷 공식사이트 - 금 선물 - 어떻게 해야만 재귀와 역추적을 깊이 이해할 수 있습니까?
어떻게 해야만 재귀와 역추적을 깊이 이해할 수 있습니까?
회고성 분석은 추적 결정의 특징 중 하나이다. 원래 의사 결정 메커니즘, 의사 결정 내용, 주관적이고 객관적인 환경 등에 대한 분석을 가리킨다. 출발점, 원인, 문제의 성격, 오류 정도 등에서. 의사결정 실수를 초래한 순서대로 조사하다.
[알고리즘 분석]
문제의 상태를 설명하기 위해서는 이전 상태를 사용해야 하며, 이전 상태를 설명하기 위해서는 이전 상태를 사용해야 합니다. 이러한 자체 정의 방법을 재귀 정의라고 합니다. 예를 들어 함수 f(n) 는 다음과 같이 정의됩니다.
F (n) = n * f (n-1) (n > 0)
F(n)= 1 (n=0)
0 일 때 f(n) 는 f(n- 1) 에 의해 정의되어야 하고 f(n- 1- 1) 는 f (n) 에 의해 정의되어야 합니다
위의 예에서 재귀 정의에는 두 가지 요소가 있음을 알 수 있습니다.
(1) 반복 경계 조건. 즉, 설명하는 문제의 가장 간단한 경우로, 그 자체는 더 이상 재귀 정의를 사용하지 않습니다.
앞의 예와 마찬가지로 n=0 일 때 f(n)= 1, f(n- 1) 로 정의하지 않습니다.
(2) 재귀 정의: 문제를 경계 조건으로 변환하는 규칙. 재귀 정의는 문제를 더 쉽게 만들어야 한다.
예를 들어 f(n) 는 f(n- 1) 로 정의되며 f(0), 즉 경계 조건에 점점 가까워지고 있습니다. 가장 간단한 경우는 f(0)= 1 입니다.
재귀 알고리즘은 종종 비효율적이며 메모리를 많이 소모합니다. 그러나 재귀에도 장점이 있어 재귀적 관계와 구조가 복잡한 프로그램 소개를 간결하게 하고 가독성을 높일 수 있다. 특히 경계에서 해법에 이르는 전 과정을 찾기 어려운 상황에서 문제를 더 멀리 밀어도 결과는 원래 문제의 관계를 유지한다면 재귀 알고리즘으로 프로그래밍하는 것이 더 적합하다.
재귀는 1 으로 나뉩니다. 직접 재귀, 재귀 프로세스 p 는 직접 자신을 호출합니다. 2. 간접 재귀, 즉 p 는 다른 프로세스 d 를 포함하고 d 는 p 를 호출합니다.
재귀 알고리즘은 다음과 같은 일반적인 경우에 적용됩니다.
1. 데이터는 재귀적으로 정의됩니다.
예를 들어 Peibonachi 시퀀스의 정의: f (n) = f (n-1)+f (n-2); F (0) =1; F( 1)=2 입니다.
해당 재귀 프로그램은 다음과 같습니다.
함수 fib(n: 정수): 정수;
시작
N = 0 이면 fib:= 1 {반복 경계}
그렇지 않으면 n = 1 이면 fib := 2 입니다
Elsefib: = fib (n-2)+fib (n-1) {recursive}
끝;
이러한 재귀 문제는 재귀 경계를 재귀 경계 조건으로 사용하여 재귀 알고리즘으로 변환할 수 있습니다.
2. 데이터 간의 관계 (즉, 데이터 구조) 는 트리 순회, 그림 검색 등과 같이 재귀적으로 정의됩니다.
문제는 역 추적 방법과 같은 재귀 알고리즘으로 해결됩니다.
문제의 어떤 가능성에서, 이 상황에서 얻을 수 있는 모든 가능성을 수색한다. 이 길이 끝날 때.
출발점으로 돌아가서, 다른 가능성에서 출발하여 검색을 계속하다. 이러한 지속적인 "역추적" 솔루션을 찾는 방법을 "역추적" 이라고 합니다
역추적 방법.
[참조 절차]
다음은 역추적 방법을 사용하여 모든 경로를 찾는 알고리즘 프레임워크입니다. 필기는 이미 아주 분명하게 썼으니, 자세히 이해하시기 바랍니다.
Constmaxdepth =;
Type statetype =;; {상태 유형 정의}
운영자 유형 =; {연산자 유형 정의}
Node = 레코드 {노드 유형}
상태: 상태 유형; {상태 필드}
운영자: 운영자 유형 {연산자 필드}
끝;
{참고: 노드의 데이터 유형은 시험 문제에 따라 단순화할 수 있습니다.}
변수를 정의합니다
스택: 배열 [1... maxdepth]; {현재 경로 저장}
합계: 정수 {경로 수}
프로그램 make(l: 정수);
Var I: 정수;
시작
스택 [L- 1] 이 대상 노드인 경우.
시작
합계: = 합계+1; {경로 수+1}
현재 경로 인쇄 [1.. l-1];
수출
끝;
I := 1 트리 해제 횟수 do 의 경우
시작
스택 생성 [l]. 운영자;
스택 [l]. 연산자는 스택 [l- 1] 에서 작동합니다. 새 상태 스택을 생성하는 상태 [l]. 상태;
If stack[l]. 상태 충족 제약 조건 make (k+1);
{제약 조건이 충족되지 않으면 for 루프를 통해 연산자 확장이 변경됩니다. }
{재귀적으로 돌아가면 호출 전 스택 포인터 및 연산자가 자동으로 복구되고 for 루프를 통해 연산자 확장이 변경됩니다. }
{참고: stack[l] 을 확장할 때 글로벌 변수를 사용하는 경우. 상태, 복구하기 위해 몇 개의 명령문을 삽입해야 합니다.
스택 [l- 1]. 상태의 값입니다.
끝;
{더 이상 사용할 수 있는 연산자가 없습니다. 역추적 중}
끝;
시작
합계: = 0; {0 으로 초기화된 경로 수}
프로세스 초기화
마이크 (l);
총 인쇄 경로 수
끝내다.