2016-07-03 4 views
-1

나는 "while (true)"로 이것을 시도 할 때 무한히 반복 할 수 없다는 것이 궁금합니다. 그렇다면 작동하는 "Counter"라는 객체를 사용하면됩니다. 메서드 "function()"을 무한대로 사용하면 6200으로 작동하고 때로는 최대 값이 ~ 6100 또는 ~ 6300으로 변경됩니다.이 방법과 어째서 작동하는지 알 수있는 사람이 있습니까?무한히 루프 메서드를 시도하는 중

public class Infinity { 

    public static void main(String[] argv) 
    { 
    //Counter count = new Counter((short)0,(short)6180,(short)1); 
    //count.startCounter(true); 


    int a = 1; 
    while (true) { 
     a = a + 1; 
     System.out.println("Value: " + a); 
    } 
    } 
} 

이 내 메인 클래스입니다

public class Counter 
{ 
    private short max; 
    private short number; 
    private short multiplicator; 

    public Counter(short n,short m,short mp) 
    { 
    System.out.println("Implementing given numbers..."); 
    this.number=n; 
    this.max=m; 
    this.multiplicator=mp; 
    System.out.println(""); 
    } 

    public void startCounter(boolean b) 
    { 
    if (b == true) 
    { 
    System.out.println("-----------------------------------"); 
    System.out.println("Starting counting from " + this.number + " to " + this.max); 
    System.out.println("-----------------------------------"); 
    this.function(); 
    } 
    else { 
     System.out.println("Your Counter was set to false, abborting Start..."); 
    } 
    } 

    public void function() 
    { 
    if (this.number < this.max) 
    { 
     this.number = (short)(this.number + this.multiplicator); 
     System.out.println("Number: " + this.number); 
     this.function(); 
    } 
    else { 
     System.out.println("Ending of Number"); 
    } 
    } 
} 

이것은 Dinamically 묶는 범위 내 추가 카운터 클래스

+0

'StackOverflow' 오류가 발생합니까? –

+2

@ 엘리사 도프 당신 Stackoverflow 의미합니까? – Li357

+0

최대 숫자를 9000으로 설정하면 "Counter.function (Counter.java:36)"에 "012"가 표시됩니다. – zapole

답변

-1

게시 한 코드가 루프가 아니며 recursive 함수 호출입니다.

Counter.function()을 블랙 박스로 생각하면 도움이됩니다. 그것이 호출 될 때, 프로그램 실행은 블랙 박스에 들어가고 함수가 끝날 때까지 (즉, 리턴 할 때까지) 바깥으로 돌아 가지 않습니다.

처음으로 function()으로 전화 할 때 하나의 블랙 박스를 입력하게됩니다. 그런 다음 function() 번으로 번에서으로 전화를 걸어 새 블랙 박스에 들어갑니다. 그러나 여기 잡아라 - 당신은 아직 첫 번째 블랙 박스를 종료하지 않았습니다!

Executing function() 
    Executing function() 
     Executing function() 
      ...etc... 
     return; 
    return; 
return; 

문제는 각각의 블랙 박스 입력을 위해, 자바 메모리 on the stack를 할당 할 필요가 있으며, 그 메모리 (기능까지 블랙 박스를 해제 할 수 없다는 것입니다 : 그래서 당신은 다음과 같이 될 겁니다) 실행이 완료되었습니다. 결과적으로 결국 메모리가 부족해질 것입니다.

사용, 루프 대신 할 당신이 당신의 질문에 제안대로입니다해야합니까 :

public bool function() { 
    if (this.number < this.max) { 
     this.number = (short)(this.number + this.multiplicator); 
     System.out.println("Number: " + this.number); 
    } else { 
     System.out.println("Ending of Number"); 
    } 

    return (this.number < this.max); 
} 

그리고이 같은 것을 사용할 수 있습니다를 호출 :

while(function()) 
    ; 

나이 :

while(true){ 
    if(!function()) 
     break; 
} 

이렇게하면 다음 호출이 시작되기 전에 하나의 함수 호출이 완료 될 수 있습니다. 또는 블랙 박스의 유추를 계속하려면 다음과 같이 보일 것입니다 :

Executing function() 
return; 
Executing function() 
return; 
Executing function() 
return; 
...etc... 
+0

와우,이게 정말 도움이 되었어, 마침내 어떻게 작동하는지 이제 알았어!, 정말로 고마워. – zapole

+0

어떻게 든 느리게 계산할 수 있니? – zapole

0

자바가 활성화 레코드 (AR)을 저장하기 때문에 당신은, 루프를 실행 무한 질수있다 (DES) 스택에 있지만 스택은 무한히 공간이 있습니다.

그래서, 순서대로, 당신은 모든 메모리 공간을 사용하지 않도록 Java는 StackOverflow 오류를 throw합니다.

+0

고마워!, 나는 그것을 몰랐다. 이제 나는 인터넷에서 (AR)과 (DES)에 관해 읽을 예정이다. 정말 고마워!:) – zapole

관련 문제