2017-08-29 25 views
1

我想创建一个递归方法,打印Pascal的三角形颠倒和权利。我想使用一个布尔变量在倒三角形和右侧三角形之间切换。到目前为止,我已经成功地编写的代码,以使杨辉三角倒挂:Java:递归方法,打印Pascal的三角形颠倒和权利(通过布尔值)

public class Main 
{ 
    boolean upsideDown = true; 

    public void printPascal(int n) 
    { 
     if(!upsideDown) 
     { 
      //THIS IS WHERE I'M STUCK 
     } 
     if (upsideDown) 
     { 

       if(n < 0) 
        return; 
       for (int k = 0; k <= n; k++) 
       { 
        System.out.print(binom(n, k) + " "); 
       } 
       System.out.println(); 
       printPascal(n - 1); 

     } 
    } 

    public int binom(int n, int k) 
    { 
     if (k==n || k==0) 
      return 1; 
     else return binom(n-1,k-1) + binom(n-1, k); 
    } 

    public static void main(String[] args) 
    { 
     new Main().printPascal(10); //This will print the Pascal's triangle 
            //from levels 10 to 0 
    } 

} 

所以,现在,我想打印帕斯卡三角rightside向上(从等级0至10)。我怎样才能做到这一点的递归方法?

我知道网上有很多关于帕斯卡三角形的代码。但我找不到任何与我的问题有关的问题。

+0

它是否必须是一个单一的递归方法打印两个?只需制作'printPascalUp'和'printPascalDown'递归方法会更容易。 –

+0

您的'printPascal(int n)'方法只有一个参数(用于当前编号)。对于'upsideDown',如果(n <0),则递归停止。对于'!upsideDown',该方法需要另一个参数来知道何时停止。 – howlger

+0

下面的答案有帮助吗? – Assafs

回答

2

似乎最优雅的解决方案是更改打印顺序,以便最后打印第一步,然后打印第二步,最后打印第一步。这会工作吗?

public void printPascal(int n) { 
    if(!upsideDown) 
    { 
     if(n < 0) 
       return; 
      //print the future step first, then print current step 
      printPascal(n - 1); 
      System.out.println(); 
      for (int k = 0; k <= n; k++) 
      { 
       System.out.print(binom(n, k) + " "); 
      } 


    } 
    if (upsideDown) 
    { 

      if(n < 0) 
       return; 
      for (int k = 0; k <= n; k++) 
      { 
       System.out.print(binom(n, k) + " "); 
      } 
      System.out.println(); 
      printPascal(n - 1); 

    } 
} 
+0

@TheSaviour您可以通过点击旁边的复选标记来接受答案,让它变成绿色吗? – Assafs

+0

这似乎已经成功了。谢谢。我只是想和它一起玩,并试着更多地理解它,然后才能选择你的答案作为最佳答案。但我相信你给我的只是我需要的东西。 – TheSaviour

+1

你能解释为什么你在for循环_after_所有的递归调用中调用binom吗?在每次递归调用期间,_n_的值是否以某种方式存储到内存中? – TheSaviour