2016-11-26 101 views
0

我設法打印金字塔這樣的循環:打印金字塔使用遞歸僅

void printtree() { 
    for (int i=0; i<row; i++){ 
    for (int j=0; j<row-i-1; j++) 
     System.out.print(" "); 
    for (int k=row; k>row-i-1; k--) 
     System.out.print("* "); 
    System.out.println(); 
    } 
} 

輸出看起來是這樣的:

 * 
     * * 
     * * * 
    * * * * 
    * * * * * 
    * * * * * * 
    * * * * * * * 
* * * * * * * * 
* * * * * * * * * 

我想只有讓這個使用遞歸,如何我應該構造函數嗎?我關心的是嵌套循環,我只能解釋單個內部或外部循環。我知道它是在每行上被(行1)空格和行號「*」的行解釋的,然後換成新行。這裏的基本情況是什麼?

+0

想象一下:爲了與K空間的偏移量,應先打印N-1星打印的最後N個明星具有K + 1個空格的偏移量。 –

+1

你看過遞歸嗎?如果是這樣,你有沒有嘗試過自己實現呢?當然,如果你不做任何研究,你會遇到困難。如果您已經嘗試過,但無法讓您的實施工作,請發佈您的嘗試 –

回答

3

既然你想解決方案只使用遞歸。我假設你不想在程序中產生任何循環。如果您想快速將程序轉換爲遞歸方法,請查看每個循環並考慮如何轉換它。

您可以轉換

for (int j=0; j<row-i-1; j++) 
     System.out.print(" "); 

運作

static void printSpace(int j, int i) { 
     if (j < row - i - 1) { 
      System.out.print(" "); 
      printSpace(j + 1, i); 
     } 
    } 

請注意,上述的遞歸函數不一樣的for循環。它需要您在for循環中使用的相同參數。現在這個技巧,你可以申請for循環打印明星。

static void printStar(int k, int i) { 
     if (k > row - i - 1) { 
      System.out.print("* "); 
      printStar(k - 1, i); 
     } 
    } 

類似的技巧可以應用於outer for循環,您可以轉換代碼。

完整代碼

static int row = 5; 

    static void printtree() { 
     printPyramid(0); 
    } 

    static void printPyramid(int i) { 
     printSpace(0, i); 
     printStar(row, i); 
     System.out.println(); 

     if (++i < row) 
      printPyramid(i); 
    } 

    static void printSpace(int j, int i) { 
     if (j < row - i - 1) { 
      System.out.print(" "); 
      printSpace(j + 1, i); 
     } 
    } 

    static void printStar(int k, int i) { 
     if (k > row - i - 1) { 
      System.out.print("* "); 
      printStar(k - 1, i); 
     } 
    } 
-1
static void recursion(int row, int k, int j) 
{ 
if(row>10) 
{ 
    return; 
} 
else 
{ 
    if(k==row) 
    { 
    System.out.println(); 
    recursion(++row, 0,0); 
    } 
    else if(10-j>row) 
    { 
    System.out.print(" "); 
    ++j; 
    recursion(row, k, j); 
    } 
    else 
    { 

    System.out.print("* "); 
    recursion(row, ++k, j); 
    } 
} 
} 

調用方法

recursion(0,0,0); 
+0

Downvote,因爲這裏沒有解釋;它只是一個代碼轉儲。 – Carcigenicate