2011-03-15 3 views
1

저는 재치가 있습니다 ... 재귀의 쉬운 예를 이해 합니다만, 까다로워지면 단서가 없습니다. 다음은 그 예입니다. 누군가가하는 일을 말할 수 있다면 기쁠 것입니다. 컴파일러가 할 무엇을 ...재귀 - 무슨 일을합니까

public static char mystery(String s, int n, int m) 
{ 
if (n==1) return s.charAt(m); 

char first = mystery(s, n/2, m*2); 
char second = mystery(s, n/2, m*2 +1); 

System.out.print(first + " " + second + " "); 

return first; 
} 
어떤 메소드가 호출 될 때 인쇄

: (1 "fredpass", 5)

대답은이 passps 신비

I 돈 그들이 어떻게 거기에 도착하는지 CLUE가 있습니다 ...

누군가가이 문제에 대해 저를 도울 수 있다면 정말 감사하겠습니다. 인터넷의 다른 곳에서 그들은 단지 계승의 쉬운 예를 설명합니다. char first = mystery (blah);에서와 같이 두 번 호출하면 다시 발생합니다. char second = mystery (blah);

+1

음으로 진행해야한다,이 방법의 의도가 무엇인지 신비이다.그러나 어떻게 작동하는지는 다른 형태의 재귀가 작동하는 것과 같습니다. –

+6

이 줄이 맞습니까? '문자열을 n으로 나눌 때 컴파일 에러로'n/s' 부분을 쓰지 않겠습니까? – justkt

+0

숫자가 맞지 않습니다. 왜 'n/2'대신에 'n/s'를 사용합니까? –

답변

5

그냥 손으로 호출을 추적 : 등등

mystery(5, 1) 
    first = mystery(2, 2) 
     first = mystery(1, 4) = 'p' 
     second = mystery(1, 5) = 'a' 
    second = mystery(2, 3) 
     ... 

하고 있습니다. 호출 스택, 함수 호출의 상태 및 로컬 변수의 전체 그림을 그리는 데 충분한 용지를 제공하십시오. 예를 들어, 내 사진의 가장 안쪽 전화가 "p a"를 인쇄 한 후 'p'을 반환하므로 mystery(2, 2) 뒤에 해당 문자를 씁니다.

5

따라서 이미 알고있는 예제는 recursion이며 사용 방법은 이미 알고 있습니다.

아마도 누락 된 것은 입니다. 재귀가 작동하는 이유는입니다. 이를 이해하려면 메소드가 호출 될 때 어떤 일이 발생하는지 알아야합니다. call stack에 익숙해 지십시오.

논리적 인 관점에서 코드를 순차적으로 '걷는'것을 고려해야합니다. 메서드를 재귀 적으로 호출하면 다른 절차 코드와 마찬가지로 결과가 반환되고 실행이 계속됩니다. 그러나 모든 메소드 호출에는 고유 한 scope of variables이 있으며이 호출은 해당 재귀 호출에서만 유효합니다.

1

@ jleedev의 답변에 설명 된 것처럼 손을 "실행"하는 것은 유용한 연습입니다. 특히 전에 해보지 않은 경우에 특히 유용합니다.

다른 대안은 Java 디버거의 제어하에 코드를 실행하고 호출 스택/로컬 변수를 검사하면서 실행을 단계적으로 실행하는 것입니다. 이것은 오류가 발생하기 쉽지만, 너무 빨리 수행하면 실제로 진행중인 작업에 대한 중요한 세부 사항을 놓칠 수 있습니다.

mystery 기능이 실제로하는 일은 수수께끼라고 생각하지 마십시오. 이해하기 어렵도록 명확하게 설계되었습니다. (그리고 나는 어떤 점도 보지 못한다 ... 신비스러운 것 외에는). 당신이 만날 가능성이있는 대부분의 재귀 함수는 유용한 것을 할 것이고, 이해하기가 더 쉬울 것이다 ...

0

모든 재귀에 대해 고려해야 할 두 가지가 있습니다.

  1. 모든 재귀 적 방법에는 기본 사례가 있어야합니다.
  2. 모든 재귀이 기본 케이스