재귀는 프로세스를 정의하는 문제(나는 문제에 대한 해결책)관점에서의(간단한 버전의)다.
예를 들어,우리가 할 수 있을 정의하는 작업을 찾아”집에 당신의 방법으로”:
-
는 경우,가정에서 중지 이동합니다.
-
집으로 한 걸음 나아가십시오.
-
“집으로가는 길 찾기”.
여기서 집으로가는 길을 찾는 해결책은 두 단계(세 단계)입니다. 첫째,우리는 이미 집에 있다면 집에 가지 않습니다., 둘째,우리는 상황을 더 간단하게 해결할 수있는 매우 간단한 행동을합니다. 마지막으로 전체 알고리즘을 다시 실행합니다. 위의 예를 꼬리 재귀라고합니다. 이것은 매우 마지막 문이 재귀 알고리즘을 호출하는 곳입니다. 꼬리 재귀는 루프로 직접 번역 될 수 있습니다.
템플 스퀘어를 찾기위한 재귀 적”알고리즘”을 어떻게 작성 하시겠습니까?
재귀의 또 다른 예는 숫자 목록에서 최대 값을 찾는 것입니다. 목록의 최대 값은 첫 번째 숫자 또는 나머지 숫자 중 가장 큰 숫자입니다., 여기에 어떻게 우리가 쓰는 의사 알고리즘의:
부품의 재귀적 알고리즘
모든 재귀적 알고리즘은 다음과 같습니다:
-
기초한 경우(즉,때를 중지)
-
작품을 향해 기지의 경우
-
적화(즉, 자신을 호출)
“작업을 향해 기지의 경우”우리가 어디 문제를 간단하(예를들면,분할 목록은 두 부분으로,각각보다 작은 원래). 재귀 호출은 동일한 알고리즘을 사용하여 더 간단한 버전의 문제를 해결하는 곳입니다., 기본 경우 해결책”간단한”가능한 문제는(예를 들어,기본 케이스에서 문제가’찾아에서 가장 많은 수 목록이 될 수 있을 것이면 하나의 번호입니다… 그리고 정의에 의해 하나의 숫자 만있는 경우 가장 큰 것입니다).
간단한 예제:세 번호
추가 세 번호에 해당하는 추가 첫 번째 두 번호,그리고 다음을 추가 이러한 두 가지합니다.
(참고,Matlab 에서는 모든 인수없이 함수를 호출 할 수 있습니다. Nargin 함수는 컴퓨터에 지정된 값 수를 알려줍니다., 따라서 add_numbers(1)는 1 의 nargin 을 가질 것이다;add_numbers(1,1)는 2 의 nargin 을 가질 것이다;add_numbers(1,1,1)는 3 의 nargin 을 가질 것이다.)
를 식별하는 3 개의 부품을 재귀적 알고리즘:
모든 재귀적 알고리즘이 있어야 합 다음과 같은 세 가지 단계:
왜 재귀 작품
에서 재귀적 알고리즘을 컴퓨터의”기억”모든 이전의 상태는 문제입니다. 이 정보는”활성화 스택”(즉,각 기능 작업 영역 내부)의 컴퓨터에 의해”보유”됩니다.
모든 함수에는 함수 호출 당 자체 작업 공간이 있습니다.,
미로 예제:
고려 사각형 격자의 객실,각 방지 않을 수도 있는 문 북쪽에,남쪽,동쪽,서쪽 측면입니다.
어떻게 미로에서 길을 찾으십니까? 여기에 하나의 가능한”알고리즘”을 찾기 위한 대답:
에 대한 모든 문서 현실 경우,문에 이르게 하는 문입니다.
여기서”트릭”은 물론,문이 출구로 이어지는 방으로 인도하는지 어떻게 알 수 있습니까? 대답은 우리가하지 않지만 컴퓨터가 우리를 위해 그것을 알아 내도록 할 수 있다는 것입니다. 위의 알고리즘에 대한 재귀 부분은 무엇입니까?, 그것의”문은 미로에서 이끌어 낸다”. 문이 미로에서 빠져 나오는지 어떻게 알 수 있습니까? 우리가 알고 있기 때문에 안을 다음 방(가 문을 통),우리는 동일한 질문을 우리는 어떻게는 미로에서 얻을 수?
컴퓨터가 모든”what ifs”를”기억”하는 것입니다. 첫 번째 문을 가져 가면,두 번째 문을 가져 가면,다음 문을 가져 가면,등등. 고 가능한 모든 도어를 이동할 수 있습을 통해,컴퓨터 그 기억이 무엇 ifs 한 모든 문 후에는,그 후,etc.,이 끝날 때까지 발견된다.
다음은 실제 코드 구현에 가깝습니다.,
질문:위의 기본 사례는 무엇입니까?
답변:(트릭 질문이었습니다)코드에 기본 사례가 없습니다. 방이 출구 인 경우 시작시 확인해야합니다. 그렇다면 재귀가 없습니다!
function success = find_way_out( maze, room ) if room is exit → return true room ← mark as visited % rest of code ... end
질문:방문한 방을 어떻게 표시합니까?
답변:다양한 기술이 있습니다. 방이 구조(또는 개체)인 경우 방문한 필드 방향을 방에 추가 할 수 있습니다. (예:방.visited=true;)객체를 사용하지 않는 경우 미로와 같은 크기/모양 인 부울 플래그의 행렬을 가질 수 있으며이 값을 사용하십시오.,
질문:위의 알고리즘에 다른 문제가 있습니까?
답변:그 해답을 찾을 수 있습에 대하여 생각해서 다음과 같은 질문:무슨 일이 일어날 경우에는 미로었다 거대한 그리드의 동일한 크기의 직사각형의 객실을,각각의 문에 모든 벽? 상상 당신은 북쪽으로 이동을 통해 첫 출동을 통해 다음 객실에는 문을 통해서 남쪽으로는 객실을 그 웨스트를 통해 객실에는 문입니다. 당신은 어디에서 끝나나요? 당신이 시작한 곳으로 돌아 왔습니다! 더 나쁜 것은,이 루프를 영원히 계속 만들 수도 있습니다. 용맹 한 모험가가이 문제를 어떻게 해결하겠습니까?,
그것에 대한 한 가지 대답은 분필 조각을 사용하고 입력하는 모든 방의 바닥에 큰 X 를 넣는 것입니다. 따라서 바닥에 X 가있는 방으로 돌아올 때 들어갈 필요가 없다는 것을 알고 있습니다. 프로그램의 경우”본”또는”방문한”부울 플래그를 사용해야합니다. 모든 방에는 깃발이 있습니다. 모든 방은 플래그가 거짓으로 설정되는 것으로 시작합니다. 방을 방문하면 플래그를 true 로 설정합니다., 마지막으로”기본”당신은 라인을 가지고 같은.
function success = find_way_out( maze, room ) % exit chack if room is visited → return false % rest of code ... end
재귀할 수 있습 동일하게 적용하는 컴퓨터 알고리즘:
일부 컴퓨터 관련 예에는 다음이 포함됩니다:추가의 명부 숫자,피보나치 계산 시퀀스,컴퓨팅을 계승합니다.
루프 및 꼬리 재귀
일부 재귀 알고리즘은 루프와 매우 유사합니다. 알고리즘의 마지막 문은 알고리즘을”다시 시작”하기 때문에 이러한 알고리즘을”꼬리 재귀”라고합니다. 꼬리 재귀 알고리즘은 루프로 직접 변환 될 수 있습니다. 피>
답글 남기기