2012-05-22 3 views
0

재귀는 Java에서 어떻게 구현됩니까? 내 질문은 Java에서 재귀 메서드가 실행될 때 어떤 일이 발생하는지에 관한 것입니다. 나는 그것이 스택을 사용한다는 것을 모호하게 이해하지만 예제와 함께 명확한 설명을 찾고있다.Java에서 재귀를 구현하는 방법

+1

는 다음을 시도하십시오 http://www.javamex.com/tutorials/techniques/recursion_how.shtml –

+0

그는 "스택"하지 스택) –

+0

@AmitBhargava 링크가 재귀가 무엇인지 설명하고,하지만 난 찾고 있어요 그것이 Java로 구현되는 방법 – 18bytes

답변

11

재귀는 Java에서 다른 (명령형) 언어와 다르게 처리되지 않습니다.

모든 메소드 호출에 대해 스택 프레임을 보유하는 a stack이 있습니다. 해당 스택은 call stack입니다 (또는 의미가 의미가 명확한 경우 단순히 "스택"이라고 함). 스택의 요소를 "스택 프레임"이라고합니다.

스택 프레임은 전달 된 메소드 인수와 메소드 호출의 로컬 변수 (그리고 리턴 주소와 같은 다른 데이터)를 보유합니다.

메서드가 자체적으로 (또는 사실 메서드를 호출 할 때) 메서드를 호출하면 새로 호출되는 메서드의 매개 변수와 로컬 변수에 대해 새 스택 프레임이 만들어집니다. 메소드 실행 중에

코드 수있는 전류 (즉, 최상위) 스택 프레임에 액세스 값.

이렇게하면 단일 (로컬) 변수가 동시에 많은 값을 가질 수 있습니다.

재귀는 일반적인 메서드 호출과 다른 방법으로 처리되지 않습니다. 단, 여러 스택 프레임은 같은 메서드 호출을 동시에 나타낼뿐입니다.

+1

"꼬리 호출 재귀 최적화를 제외하고"라고 말할 것입니다. 하지만 분명히 Java VM은 아직 지원하지 않습니다. http://stackoverflow.com/questions/3616483/why-does-the-jvm-still-not-support-tail-call-optimization –

+0

@MichaelAnderson : 간단히 말하자면 꼬리 재귀 최적화는 단순히 현재 스택을 다시 사용하는 것입니다 프레임은 컴파일러/런타임이 반환 주소를 제외하고는 더 이상 필요 없다는 것을 알 때 사용합니다. 스택 (및 재귀) 작동 방식을 근본적으로 변경하지 않습니다. –

0

메서드가 호출 된 경우 매개 변수, 로컬 변수 및 반환 주소를 유지할 공간이 필요한 경우이 공간을 활성화 레코드 (스택 프레임)라고합니다.

재귀 재귀 호출은 litterally 때문에 , 그것은 자기 만 같은 원래의 또 다른 인스턴스를 호출하는 방법의 인스턴스를 호출하는 방법을 호출자와 같은 이름을 가지고 발생하는 방법을하지 않는 부르고있다. 이러한 호출은 시스템에 의해 구별되는 다른 활성화 레코드 에 의해 내부적으로 표현됩니다.

관련 문제