2014-09-04 6 views
1

저는 C++을 처음 접했고 지금은 재귀를 학습하고 있습니다. 재귀를 사용하여 끝에 배열의 인덱스를 시작하지 않고 역순으로 요소를 표시하려고했습니다.배열을 역순으로 인쇄하는 재귀 적 솔루션 이해

물론 루프를 사용하는 것이 매우 쉽지만 재귀 사용은 다른 문제입니다. 나는이 문제에 대한 해결책을 온라인에서 찾았지만 각 값을 정확히 출력 할 수있는 방법을 이해할 수는 없다.

int main() { 
    int values[5] = {1,2,3,4,5} 
    recArrayBackPrint(values,5); 
} 

내가 할 수있는 :

void recArrayBackPrint(int array[],int size) 
{ 
    if (size > 0) 
    { 
     recArrayBackPrint(array+1,size-1); 
     cout << array[0] << " "; 
    } 
// base case is empty array (size == 0), so do nothing 
} 

나는이 경우, 배열 + 1은 같은 것을 사용하여 추적하는 시도 후 현재 요소 + 1에있는 메모리 주소를 참조 할 것이라는 점을 이해 크기가 0 인 모든 방법을 얻지 만 여전히 배열 [4], 배열 [3] .. 등을 인쇄 할 수 있을지 전혀 모르겠다. 내 생각에는 recArrayBackPrint를 치고 모든 방향으로 가야한다. 크기를 0으로 설정 한 다음 아무 것도하지 않습니다.

그래서 정확히 무슨 일이 벌어지고 있습니까?

답변

0

크기가 0이 될 때까지 모든 함수는 아무것도 인쇄하지 않고 반복적으로 자체를 호출하므로 스택은 매개 변수 (array + 1, size-1), (array + 2, size-2) 반환 주소. 크기가 0이면 함수는 마지막 문자 (배열 [size-1]에있는 문자)를 반환하고 인쇄 한 다음 해당 인스턴스는 첫 번째 문자까지 반환하고 마지막 문자를 인쇄합니다. 첫 번째 문자를 인쇄하는 함수의 인스턴스입니다.

0

recArrayBackPrintTMP도 배열을 인쇄하는 함수라고 가정합니다. 남아있는 배열을 인쇄 한 후 돌아 오면 recArrayBackPrint은 아무 것도하지 않고 첫 번째 요소를 인쇄합니다..

void recArrayBackPrint(int array[],int size) 
{ 
    if (size > 0) 
    { 
     recArrayBackPrintTMP(array+1,size-1); 
     cout << array[0] << " "; 
    } 
// base case is empty array (size == 0), so do nothing 
} 

recArrayBackPrintTMP 비슷한 것을 다음 가정하지만, 다시 역으로 이후 모든 요소 (2) 인쇄 recArrayBackPrintTMP2을했다.

void recArrayBackPrintTMP(int array[],int size) 
{ 
    if (size > 0) 
    { 
     recArrayBackPrintTMP2(array+1,size-1); 
     cout << array[0] << " "; 
    } 
// base case is empty array (size == 0), so do nothing 
} 

이제 유사한 기능을 모두 작성하는 대신 재귀를 수행 할 때 동일한 기능을 다시 사용한다고 가정 해 보겠습니다.

1

recArrayBackPrint 처음에, 그 다음, 1
을 {1,2,3,4,5}의 첫 번째 요소를 인쇄하는 것뿐만 출력하기 전에 첫 번째 요소 {2 인쇄 제 recArrayBackPrint 입사 , 3,4,5}, 그 다음에 2.
여전히 출력 2 이전에 세 번째 recArrayBackPrint은 {3,4,5}에서 3을 인쇄합니다.
{0}에서 5를 인쇄하려면 마지막까지 recArrayBackPrint까지. 다음 출력 순서는 다음과 같습니다
이 (5)
(4)
(3)
(2)
(1)

나는 희망 나 자신을 분명히해라.그래서

To print out an array of N values backwards: 
    Print out the last (N-1) backwards 
    Print out the first one. 

:

0

는 그래서 psuedocode 약이있다

To print out the numbers from 1-5 backwards: 
    print 2-5 backwards; to do this: 
    print 3-5 backwards; to do this: 
     print 4-5 backwards; to do this: 
     print 5 backwards; to do this: 
      print nothing backwards; to do this: 
      do nothing 
     print 5 
     print 4 
     print 3 
    print 2 
    print 1