2017-12-11 16 views
0

내가 입력 한 숫자가 두 배로되는 출력을 얻으려고합니다. 내 예에서 , 난 5를 넣어, 내 출력은 10, 8, 6, 4, 2되고 싶어하지만왜 재귀 Java 메소드에서 "스레드의 예외"메인 "java.lang.StackOverflowError"가 발생합니까?

Exception in thread "main" java.lang.StackOverflowError 
    at HelloWorld.recursion(HelloWorld.java:13) 
    at HelloWorld.recursion(HelloWorld.java:13) 
    at HelloWorld.recursion(HelloWorld.java:13) 
    at HelloWorld.recursion(HelloWorld.java:13) 

그러나 말하는 오류가 발생, 난 내하고 유사한 코드를 본 적이 제대로 했어, 내가 뭘 잘못 했니? 13 행이 왜 잘못 되었습니까?

public class HelloWorld{ 

    public static void main(String []args){ 
     System.out.println(recursion(5)); 
    } 

    public static int recursion(int x){ 
     int temp = x--; 
     if(x == 0){ 
      return 0; 
     } 
     else if(x > 0){ 
      return recursion(temp) + x*2; 
     } 
     return -1; 
    } 
} 
+0

스택 오버플로에 대해 알고 있습니까? –

+3

사전 및 후 지정 감소 사이의 차이점을 알고 있습니까? – tkausl

+1

'temp == x의 초기 값'이기 때문에. 그래서 당신은'recursion'을 이전 시간과 같은 값으로 호출합니다. –

답변

0

재귀 (5)가 호출 될 때 각 행을 살펴 보겠습니다.

public static int recursion(int x){ // x is 5 
    int temp = x--; // temp is 5, x is 4 
    if(x == 0){ 
     return 0; 
    } 
    else if(x > 0){ 
     return recursion(temp) + x*2; // calls recursion(5) again 
    } 
    return -1; 
} 

다른 사람들이 위에서 언급 한 것처럼 사전 감소가 필요한 곳에서는 후행 감소를 사용합니다. int temp = --x;

int x = 5, y = 5; 
int a = x--; // a is 5, x is 4 
int b = --y; // b is 4, y is 4 
0

변경 은 그렇지 않으면 재귀는 무한하다.

-1

함수를 호출하면 해당 데이터 (인수 및 지역 변수와 같은)가 함수 호출 스택에 저장됩니다. 이 스택은 공간이 제한되어 있기 때문에 재귀가 멈추지 않으면 스택 오버플로를 얻게됩니다. 이제 코드에 관해서 다른 사람들은 무엇이 잘못되었는지 지적했습니다. temp에 생각하는 값이 할당되지 않았습니다. 재귀 함수 안에 print 문을 추가하여 x 값이 실제로 들어가는 지 확인하는 것이 좋습니다. 예를 들어 매번 동일한 값이 전달되면 재귀가 실제로 진행되지 않고 스택 크기에 도달합니다. 한도. 다행히도 비슷한 문제를 좁히는 데 도움이되기를 바랍니다. 해피 디버깅!

0
public class HelloWorld{ 

public static void main(String []args){ 
    System.out.println(recursion(5)); 
} 

public static int recursion(int x){ 
    int recursion(int x){ 
    if(x == 0){ 
     return 0; 
    } 
    else if(x> 0){ 
      System.out.println(x*2); 
      recursion(--x); 
    } 
} 
0

당신은 int temp에 값을 할당 후행 감소을 사용하고 있습니다 :

int temp = x; x--;과 같은, 그래서 라인 (13)에 recursion에 대한 인수는 이전 함수 호출과 동일합니다. 그 결과, 귀하의 recursion 함수는 무한 루프에 들어갑니다.

는 그것을 얻 선행 감소 대신, 즉 : --x; int temp = x;에 해당

변화 int temp = --x;로를 사용합니다. 이제 recursion(temp)의 인수가 1 씩 감소합니다.