找出帕斯卡尔三角区的逻辑

时间:2016-02-22 07:44:19

标签: java pascals-triangle

我找到了一些代码来获取Pascal的三角形而不使用Java中的数组或nCr,如下所示:

int maxRows = 6;
int r, num;
for (int i = 0; i <= maxRows; i++) 
{
    num = 1;
    r = i + 1;

    //pre-spacing
    for (int j = maxRows - i; j > 0; j--) 
    {
        System.out.print(" ");
    }

    for (int col = 0; col <= i; col++) 
    {
        if (col > 0) 
        {
            num = num * (r - col) / col;
        }
        System.out.print(num + " ");
    }
    System.out.println();
}

对于我的生活,我无法弄清楚这段代码如何生成所需的数字(序列中的下一个):

    for (int col = 0; col <= i; col++) 
    {
        if (col > 0) 
        {
            num = num * (r - col) / col;
        }
        System.out.print(num + " ");
    }

有人可以解释数字生成背后的逻辑吗?我有兴趣了解如何获得下一位数字的公式,即num=num*(r-col)/col如何工作!我也有兴趣了解如何推导出这样的公式。

1 个答案:

答案 0 :(得分:1)

首先是一点理论: Pascal的三角形由二项式系数组成,其中第n行的第k列上的条目表示x ^(n-k)y ^ k的系数,其可以使用公式(n选择k)来计算,即n! /((n - k)!k!)。 更多细节可以在wiki找到。

现在让我们看一下代码。

num = num * (r - col) / col

假设我们现在计算第n行和第k列的num值。在执行该行之前,num具有第n行和第(k-1)列的值,即

num == (n choose (k-1)) == n! / ((n - (k-1))!(k - 1)!)

并且num的新值应为:

    (n choose k) 
== n! / ((n - k)!k!) 
== (n! / ((n - (k-1))!(k - 1)!)) * (n - (k-1)) / k 
== num * (n - k + 1) / k

所以为了获得num的新值(来自代表前一个条目的num),我们需要将它乘以(row# - col#+ 1)然后除以列#。

这正是代码正在做的事情。在这一行:

num = num * (r - col) / col

r实际上是==(行#+ 1),col是col#。

P.S。不知道如何在stackoverflow上格式化公式。一旦弄清楚如何做到这一点,需要清理我的答案。