2010-06-18 3 views
4

이 자바 코드는 어떻게 작동합니까? :
while 루프 내부 재귀, 어떻게 작동합니까?

public class Main { 
    public static void main (String[] args) { 
     Strangemethod(5); 
    } 
    public static void Strangemethod(int len) { 
     while(len > 1){ 
      System.out.println(len-1); 
      Strangemethod(len - 1); 
     } 
} 
} 

내가 그것을 디버깅 단계로 코드 단계를 수행하려하지만 난 그것을 이해하지 못했다.

업데이트 : ..이 코드의 결과를 알고 있지만 그냥 실행의 단계를 알고 싶어 언급

+2

@Nikita, 나는 OP가 그것을 쓰지 않고, 어딘가에서 그것을 발견했고, 그것을 이해하려고 노력하고 있다고 생각한다. –

+6

@ Nikita Rybak; 코드 작성 방법을 배우려는 사람들에게 잘해주십시오. :-) –

+0

@ Nikita, 나는 그것을 쓰지 않았다, 나는 단지 실행의 단계를 알기를 요구하고있다. .. –

답변

13

즉 4 3 2 1 1 1 1 1 1 ...

를 인쇄 할 수 있습니다 그리고 아무것도 이제까지 while 루프의 범위에 렌을 수정하지 않기 때문에 루프에 박히면서. 첫 번째 호출 (len = 5, 4, 3)은 루프 반복을 거치며 Strangemethod가 반환되기를 기다립니다. len = 2 일 때 while 루프는 strangemethod (1)를 호출하고 len은 1보다 커서 while 루프가 끝나고 호출이 반환됩니다. 그러나 len은 가장 밑의 나머지 whle 루프에서 여전히 2이므로 strangemethod (2)를 다시 호출합니다. 그리고 다시. 그리고 다시.

if()가 while()보다 더 적절했을 것입니다.

+1

또는 아마도 루프 내에서 len을 감소 시켜서 일종의 값 트리를 생성합니다. –

+0

@Dave 삼각형. –

+0

@Dave : Strangemethod (5) -> 4 3 2 1 1 2 1 1 3 2 1 1 2 1 1 (톰이 말하는 것처럼 삼각형) – JAB

2

편집하지 않았다 미안 : 첫 번째 응답 죄송합니다이 그것을 실현 일부러. 예 렌위한 = 5

public static void Strangemethod(5) { 
      while(5 > 1){ 
       System.out.println(5-1); 
       Strangemethod(5 - 1); 
      } 
public static void Strangemethod(4) { 
      while(4 > 1){ 
       System.out.println(4-1); 
       Strangemethod(4 - 1); 
      } 
public static void Strangemethod(3) { 
      while(3 > 1){ 
       System.out.println(3-1); 
       Strangemethod(3 - 1); 
      } 
    public static void Strangemethod(2) { 
      while(2 > 1){ 
       System.out.println(2-1); 
       Strangemethod(2 - 1); 
      } 
    public static void Strangemethod(1) { 
      while(1 > 1){//goes back to original(above) call and then an infinite loop since len was never decremented 

      } 
,691 - .IT 무한 루프 여기

간단한 플로우가 발생할

인쇄물 4 3 2 1 1 .....

+0

그러나'Strangemethod'를 한 번 호출하면'len'은 감소하지 않습니다. –

+0

@VJ : 멋진 답변입니다. 입력 해 주셔서 감사합니다! –

+0

... 그리고'Strangemethod (2)'에 대한 호출은 영원히 반복 될 것입니다. –

1

당신은 코드가 기대하는 바를 말하지 않습니다. 그러나 len 변수가 Strangemethod 메서드 내에서 값을 변경하지 않는다는 명백한 점은 final이라고 선언되었을 수 있습니다. 아마도 당신이 원하는 것은 --len; (len = len - 1;에 해당)으로 감소시키는 것일 것입니다.

1

Strangemethod(len - 1); 뒤에 len--;을 추가하십시오. 그러면 당신을 무한 루프로 보내지 않을 것입니다. 또는 수행 할 수 있습니다

System.out.println(--len); 
Strangemethod(len); 
+0

'len - 1'을'len'으로 변경하고 재귀 호출 전에'len -'을 넣을 수도 있습니다. –

+0

@Matthew : 사실, 여기에'--'를 사용하는 방법은 다양 합니다만, 방금 추가 한 다른 변형이 보여줍니다. – JAB

+0

매우 사실 ... 또는 M.H.와 코스. 방법이 무엇인지 묻습니다. 아마도 len을 갖는 것이 가장 좋습니다. 이제는 자신의 라인에있어. (재미있게 놀고 심지어 'while'표현으로 옮길 수도 있습니다.) –

2

내가 잘못하지 않았다면 무한 루프가 발생하지 않습니까?

일단 strangemethod (1)이 strangemethod (2)를 반환하면 다시 1을 인쇄 한 다음 strangemethod (1)을 다시 호출합니다.

strangemethod 호출 후 len을 감소시키는 것을 잊어 버리십니까?

0

이 코드는 영원히 반복됩니다.

len - 1의 결과는 절대로 while 루프에 저장되지 않으므로 종료 할 수 없으며 len = 2이 출력되면 1을 출력합니다.

재귀 함수에서 while을 사용하는 경우는 드뭅니다.

while(len > 1) 
{ 
    len--; 
    System.out.println(len); 
    Strangemethod(len); 
} 
: 당신이 정말이 while 나는이 같은 루프를 다시 줄 필요가 있다면

4 
3 
2 
1 

: 나는 일반적으로 당신에게 출력을 줄 것이다 그 자리에 if을보고 기대

이 의지 출력 :

4 
3 
2 
1 
1 
2 
1 
1 
3 
2 
1 
1 
2 
1 
1 
-3

또한, 나는 누군가가 당신이 무한 루프를 얻을 수 있도록 렌이 감소되지 않습니다 지적한다고 생각합니다. 나는 지금까지 단 7 명의 사람들 만 언급했다.