//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는이 메서드에서 입력을 어떻게 반전합니까?
//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는이 메서드에서 입력을 어떻게 반전합니까?
recursive 반대. s.substring(1)
은 첫 번째 문자가없는 행입니다. s.charAt(0)
이 첫 번째 문자입니다.
함수의 의미는 "행이 한 문자이면 행은 대답이고 그렇지 않으면 첫 번째 문자를 잘라내어 동일한 함수를 계산하고 끝 부분에 잘게 잘라진 문자를 추가합니다 결과".
위의 단계를 수행하면 문자열을 뒤집을 수있는 방법을 종이에서 해결할 수 있습니다.
편집 : 빈 문자열을 전달하려고하면 예외가 발생하여이 구현이 중단 될 수 있습니다. if (s.length() == 1)
에서 if (s.length() == 0)
으로 변경하면이 문제를 해결할 수 있습니다 (Tom Hawtin 덕분에이 문제를 주석에서 언급 할 수 있습니다).
여기에 recursion이 있습니다.
재귀의 각 레벨은 첫 번째 문자를 끝에 추가하고 문자열의 접미사에 대한 재귀 호출을 호출합니다. 이 만드는
return "d"
return "d" + 'c' (="dc")
return "dc" + 'b' (="dcb")
return "dcb" + 'a' (="dcba")
희망 :
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"
각 단계를 단계별로 안내하면됩니다. foo ("abcd")를 호출하면 어떻게됩니까? if() 검사가 "return s"또는 "return foo (...) ..."섹션으로 이동합니까? 두 번째 경우로 들어가면 어떻게됩니까? – Sbodd
'foo ("")'의 흥미로운 코너 케이스. (그리고'foo (new String (new char [10 * 1000 * 1000]))'). –