2009-08-21 2 views
0

는 (무료 라이센스)를 동적으로 자바 중첩 루프를 만들고, 다음과 같은 코드가 있었다 :시뮬레이션 중첩 루프 초보자의 프로그래밍 책에서

import java.util.Scanner; 

public class RecursiveNestedLoops { 
    public static int numberOfLoops; 
    public static int numberOfIterations; 
    public static int[] loops; 

    public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 
    System.out.print("N = "); 
    numberOfLoops = input.nextInt(); 
    System.out.print("K = "); 
    numberOfIterations = input.nextInt(); 
    input.close(); 
    loops = new int[numberOfLoops]; 
    nestedLoops(0); 
    } 

    public static void nestedLoops(int currentLoop) { 
    if (currentLoop == numberOfLoops) { 
     printLoops(); 
     return; 
    } 
    for (int counter=1;counter <= numberOfIterations;counter++) { 
     loops[currentLoop] = counter; 
     nestedLoops(currentLoop + 1); 
    } 
    } 

    public static void printLoops() { 
    for (int i = 0; i < numberOfLoops; i++) { 
     System.out.printf("%d ", loops[i]); 
    } 
    System.out.println(); 
    } 
} 

내가

때 입력 N = 2, K = 3, [1,1], [1,2], [1,3], [2,1], [2,2], [2,3], [3,1], [3,2], [3,3] (개행 등). 프로그램은 잘 작동합니다. 그런 다음 디버깅을 시도하고 정확히 작동하는지 이해하려고 꽤 오랜 시간을 보냈습니다. 나는 할 수 없었다. 내 질문 :

----> 왜 [1,3] 인쇄 후 'curentLoop'변수가 '1'이 될 '0'이됩니까?-> 내 디버거 (Eclipse 내장)에서 [1,3]을 인쇄 한 후 포인터가 'nestedLoops'메서드의 '}'중괄호 (값 1 인 'currentLoop')로 이동합니다. , 그리고 나서 갑자기 for 루프를 'currentLoop'= 0으로 실행하기 시작합니다. 변수는 어디에서 값 '0'을 가져 옵니까? 왜 메소드의 마지막 중괄호로 이동 한 후 메서드 이름을 호출하지 않고 'for 루프'를 실행하기 시작합니까?

이것은 여러분 중 일부에게는 매우 쉬운 질문 일 수 있습니다. 나는 초보자에 불과하다. 당신의 도움에 미리 감사드립니다.

+1

부수적으로 말하자면, 이것은 매우 끔찍한 코드입니다. 생산 세계에서 이와 같은 것을 보지 못할 것입니다. 그것은 끔찍한 일이다. –

+0

그래도 나는 그것이 어떻게 작동하는지보기에 꽤 교육적인 것이라고 생각합니다. – Imagist

+0

@imagist 예, 그걸로 갈 것입니다. 그들이이 물건에 착수 할 때 마음을 굽히는 것이 좋습니다. 어떤 개발자는 이런 종류의 프로그래밍을 피하는 법을 배우지 않는 것이 더 낫습니다. "컴파일하고 실행하면 괜찮습니다!" 시간이 지남에 따라 디버그하고 유지 보수하는 코드의 복잡성에 대해 어떠한 생각도하지 마십시오. –

답변

3

중첩 루프에 대한 재귀 호출이기 때문에. 먼저 0으로 호출됩니다. 그 다음 1로 호출됩니다. 그리고 나서 2로 호출됩니다. 총 루프 수에 도달하면 루프 실행을 시작합니다 (재귀 적 종료 조건이라고 함). 그러나 중첩 루프에 대한 각 호출은 스택에 배치되고 k를 실행 한 다음 k-1을 반환하고 실행 한 다음 k-2를 반환하고 실행 한 다음 k-3을 반환하여 k-k = 0까지 끝까지 실행합니다

내가 너라면, nestedloops() 호출에 중단 점을 배치하고 호출되는 것을 관찰 할 것입니다. 그 때, 그것이 불리는 것에 따라, 그것이 되돌아가는 그 방법으로 일하는 것을 본다.

+0

그래서 'nestedLoops (currentLoop + 1);'라인을 의미합니다. 'for'루프를 포함하는 3 개의 메서드 'nestedLoops (int currentLoop)'의 스택을 만들고, 올바르게 가져 왔습니까? – aeter

+0

+1 "끔찍한"댓글. 여기에 무슨 일이 일어나고 있는지 잠깐 나도 알아 봤습니다. – GRB

+0

@ aeter 다소 차이가 있습니다. nestedloops는 다음과 같이 0으로 호출됩니다. nestedloops (0). 그런 다음 자체를 계속해서 호출하여 최대 k (루프 수)에 도달 할 때까지 전달 된 인수를 증가시킵니다. 디버거에서 해당 내용을 보면서 진행 상황을 확인하십시오. –