我有一个 Java 编程任务。
我通过制作一个 nCr ( http://en.wikipedia.org/wiki/Combination ) 函数然后使用双 for 循环通过打印出三角形来实现它。
但是,该分配要求创建一个不均匀的 2d 数组,然后通过添加前几行中的两个数字来填充,然后打印出该数组。
我知道我将不得不按照它要求的方式完成作业,但是我有一种小小的感觉(至少对于小三角形来说)我实施的方法更好。
哪种方法更好?
我有一个 Java 编程任务。
我通过制作一个 nCr ( http://en.wikipedia.org/wiki/Combination ) 函数然后使用双 for 循环通过打印出三角形来实现它。
但是,该分配要求创建一个不均匀的 2d 数组,然后通过添加前几行中的两个数字来填充,然后打印出该数组。
我知道我将不得不按照它要求的方式完成作业,但是我有一种小小的感觉(至少对于小三角形来说)我实施的方法更好。
哪种方法更好?
我认为作业要求的方法会更好。您的方法需要多次乘法来计算三角形的每个元素。对于您需要计算的三角形的每一行,这个数字都会增加。
然而,赋值的方法需要对三角形的每个元素进行一次加法。
如果我理解您的问题,您正在尝试比较两种生成帕斯卡三角形的方法:
nCr
函数来填充三角形的每个单元格。第二种方法似乎更好。我错过了什么吗?即使您在nCr
函数中使用 memoization,这些调用也会产生开销。
通过使用递归
/*By using recursion*/
class RecursivePascal {
public static void main(String args[]) {
int n = 100;
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
//System.out.print(i+","+j+" ");
System.out.print(pascal(i, j) + " ");
}
System.out.println();
}
}
static int pascal(int i, int j) {
if (j == 0)
return 1;
else if (j == i)
return 1;
else {
return pascal(i - 1, j - 1) + pascal(i - 1, j);
}
}
}
通过使用简单的逻辑
/*By using logic*/
class p {
public static void main(String args[]) {
int one[] = {1};
int n = 13;
System.out.println("1");
for (int j = 0; j < n; j++) {
int two[] = new int[one.length + 1];
int twoCounter = 0;
for (int i = 0; i < one.length; i++) {
if (i == 0) {
two[twoCounter++] = one[i];
System.out.print(one[i] + " ");
}
if (i != 0) {
two[twoCounter++] = one[i] + one[i - 1];
System.out.print((one[i] + one[i - 1]) + " ");
}
if (i == one.length - 1) {
two[twoCounter++] = one[i];
System.out.print(one[i] + " ");
}
}
System.out.println();
one = two;
}
}
}