2009-08-21 90 views
0

在一個初學者的編程的書(遊離執照)有下面的代碼,在Java動態創建嵌套循環:模擬嵌套循環

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'變成'0'事先是'1'?在我的調試器(Eclipse內置)中打印後[1,3],指針會進入方法'nestedLoops'的最後'}'括號('currentLoop'值爲1) ,然後突然開始執行「currentLoop」= 0的for循環。變量從哪裏取值爲0?爲什麼在進入方法的最後一個大括號之後,它會開始執行'for循環',而無需調用方法的名稱?

這對於你們中的一些人來說可能是一個非常簡單的問題;我只是一個初學者。預先感謝您的幫助。

+1

作爲一個方面說明,這是非常可怕的代碼。在製作世界中你永遠不會看到這樣的事情。這很可怕。 – 2009-08-21 19:01:38

+0

不過,我認爲看它是如何工作的很有教育意義。 – Imagist 2009-08-21 19:21:40

+0

@imagist是的,我會去那。當他們開始接觸這些東西時,很容易彎曲頭腦。更多的是一些開發者從來沒有學會去避免這種類型的編程,如果它編譯並運行,那很好!「的態度,從不考慮代碼隨着時間的推移調試和維護的複雜程度。 – 2009-08-21 19:26:59

回答

3

因爲它是嵌套循環的遞歸調用。首先用0調用,然後用1.調用,然後用2.當它達到總循環數時,它開始執行循環(這稱爲遞歸終端條件)。然而,每次對嵌套循環的調用都放在堆棧上,它執行k,然後返回並執行k-1,然後返回並執行k-2,然後返回並執行k-3直到k -k = 0

如果我是你,我會在nestedloops()的調用中放置一個斷點,並觀察它被調用的內容。然後,就像它被稱爲一樣,看着它的工作方式回落。

+0

所以你的意思是nestedLoops(currentLoop + 1);'創建了3個方法'nestedLoops(int currentLoop)'的堆棧,每個方法都包含一個'for'循環,我知道它是正確的嗎? – aeter 2009-08-21 19:11:15

+0

+1表示「可怕」的評論。它甚至花了我一秒來看看這裏發生了什麼。 – GRB 2009-08-21 19:12:03

+0

@或多或少。 nestedloops被調用爲零,如下所示:nestedloops(0)。然後,它會一遍又一遍地調用自身,增加傳入的參數,直到達到最大k(循環數)。請在調試器中查看它以獲取正在發生的情況。 – 2009-08-21 19:15:12