2014-05-21 4 views
0

안녕하세요, 아래의 재귀 메서드를 이해하려고 노력하고 있지만 너무 혼란스러워 보입니다. 나는 reversePrint 메서드 자체 호출하지만 내 문제는, 그것을 처음 실행해야합니다 bcdef + a = bcdef 인쇄해야합니다. 여기 내가 혼란 스러울 때, 다음에 실행될 때 b가 charAt (0)가됩니다. 그래서 어디에? 그들은 어딘가에서 일시적으로 저장 되나요? 누군가 이해를 도울 수 있습니까? 많은 감사Java 재귀 역방향 문자열

의 예를 통해
public static void main(String[] args) { 
    // TODO code application logic here 
    System.out.println(reversePrint("abcdef")); 
} 

public static String reversePrint(String s) { 
    if (s.length() <= 1) { 
     return s; 
    } 
    return reversePrint(s.substring(1)) + s.charAt(0); 
} 
+1

가능한 복제본 [재귀 적으로 Java에서 문자열을 역순으로 변환하는 가장 좋은 방법은 무엇입니까?] (http://stackoverflow.com/questions/859562/whats-the-best-way-to-recursively-reverse-a-string -in-java) –

+0

신고자에게 문의하십시오. 그것은 모든 것을 알려줍니다. – PKlumpp

+0

디버그 모드에서 단계별로 실행하십시오. 그것은 설명이 될 것입니다. –

답변

7

하자의 작품 조금 :

당신은 reversePrint("abcdef")를 호출하여 시작합니다. 약어로, 나는 이것을 rev(abcdef)이라고 씁니다.

rev(abcdef) 

= rev(bcdef) a  // Take the beginning (a) and put it on the end. 
= (rev(cdef) b) a 
= ((rev(def) c) b) a 
= (((rev(ef) d) c) b) a 
= ((((rev(f) e) d) c) b) a 

= fedcba 

각 단계마다 원본의 부분 문자열에서 rev을 평가합니다. 먼저 rev(abcdef)을 평가합니다. 그러나이를 해결하기 위해서는 rev(bcdef)을 평가해야하며,이를 위해서는 rev(cdef) 등이 필요합니다.

우리는이 모든 것을 rev(f)까지 처리합니다. 바로 f입니다. 그런 다음 한 문자열을 다음 문자열로 연결하면 rev(abcdef) = fedcba으로 끝납니다.

Khan Academy's video on recursion (피보나치 시퀀스 사용)을 시청하는 것이 좋습니다. 그는 이것을 통해 큰 걸음을 내딛습니다. 문자열의 길이가 다시 종료 1.

abcdef 
    bcdef a 
    cdef b 
    def c 
     ef d 
     f e 
      f 

이하가 될 때까지 제 첫 문자와 나머지 문자열이 처리 사이의 문자열을 분리 여기

+0

고마워요. @ 존. 당신은 지금 그것을 아주 분명하게했습니다. – Bob

+1

@ user3545850 문제는 없습니다. 여전히 문제가 발생하면 [재귀에 관한이 동영상] (https://www.youtube.com/watch?v=zg-ddPbzcKM)을 확인하십시오. – Jonn

0

컴파일러는 스택을 진행 반복되고 최종 결과가 생성됩니다.

fedcba ... 희망적입니다.