我找到了一些代码来获取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
如何工作!我也有兴趣了解如何推导出这样的公式。
答案 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上格式化公式。一旦弄清楚如何做到这一点,需要清理我的答案。