2012-05-01 1 views
2
//method 
public static String foo(String s) 

{ 
if (s.length() == 1) 

return s; 

else 

return foo(s.substring(1)) + s.charAt(0); 
} 

foo ("abcd")는 무엇을 평가하나요? 이것이 입력을 뒤집을 것이라는 것이 나의 이해이지만, 그 이유는 무엇입니까?charAt는이 메서드에서 입력을 어떻게 반전합니까?

+0

각 단계를 단계별로 안내하면됩니다. foo ("abcd")를 호출하면 어떻게됩니까? if() 검사가 "return s"또는 "return foo (...) ..."섹션으로 이동합니까? 두 번째 경우로 들어가면 어떻게됩니까? – Sbodd

+1

'foo ("")'의 흥미로운 코너 케이스. (그리고'foo (new String (new char [10 * 1000 * 1000]))'). –

답변

3

recursive 반대. s.substring(1)은 첫 번째 문자가없는 행입니다. s.charAt(0)이 첫 번째 문자입니다.

함수의 의미는 "행이 한 문자이면 행은 대답이고 그렇지 않으면 첫 번째 문자를 잘라내어 동일한 함수를 계산하고 끝 부분에 잘게 잘라진 문자를 추가합니다 결과".

위의 단계를 수행하면 문자열을 뒤집을 수있는 방법을 종이에서 해결할 수 있습니다.

편집 : 빈 문자열을 전달하려고하면 예외가 발생하여이 구현이 중단 될 수 있습니다. if (s.length() == 1)에서 if (s.length() == 0)으로 변경하면이 문제를 해결할 수 있습니다 (Tom Hawtin 덕분에이 문제를 주석에서 언급 할 수 있습니다).

3

여기에 recursion이 있습니다.

재귀의 각 레벨은 첫 번째 문자를 끝에 추가하고 문자열의 접미사에 대한 재귀 호출을 호출합니다. 이 만드는

return "d" 
return "d" + 'c' (="dc") 
return "dc" + 'b' (="dcb") 
return "dcb" + 'a' (="dcba") 
3

희망 :

s = "abcd" => append 'a' to the end, and invoke on "bcd". 
s = "bcd" => append 'b' to the end, and invoke on "cd". 
s = "cd" => append 'c' to the end, and invoke on "d". 
s= = "d" => return "d" as it is. 

당신은 재귀에서 돌아가

, 당신은 실제로 역순으로 추가 : 당신의 예에서

, 호출 스택은 같을 것 이 경우 재귀가 어떻게 작동하는지 명확히 알 수 있습니다.

foo("bcd") + "a" 
    (foo("cd") + "b") + "a" 
    ((foo("d") + "c") + "b") + "a" 
     (("d" + "c") + "b") + "a" -> "dcba" 
관련 문제