Java 嵌套for循环打印多少次';y';?
我已经看了这个例子有一段时间了,我被困住了,我的问题是这个陈述有多少次:Java 嵌套for循环打印多少次';y';?,java,Java,我已经看了这个例子有一段时间了,我被困住了,我的问题是这个陈述有多少次: System.out.println(y); 将在以下代码中执行: for(int x=0;x<N;x++){ for(int y=x;y<N;y++){ System.out.println(y); } } for(intx=0;x是的,它是N+(N-1)+(N-2)+…… 用另一种方式写,它显然是1..N中的数字之和,它具有众所周知的0.5*N*(N+1)解,也可以写成0.5*(N^2+
System.out.println(y);
将在以下代码中执行:
for(int x=0;x<N;x++){
for(int y=x;y<N;y++){
System.out.println(y);
}
}
for(intx=0;x是的,它是N+(N-1)+(N-2)+……
用另一种方式写,它显然是1..N
中的数字之和,它具有众所周知的0.5*N*(N+1)
解,也可以写成0.5*(N^2+N)
由于N^2
项占主导地位,因此在大O表示法中,这被视为O(N^2)
,0.5常数因子被忽略。答案将在精确的1/2N(N+1)行上打印出答案1/2N(N+1)次
例如,对于1,它将打印1次。对于2,它将打印3次,对于3,它将打印6次
模式是:1、3、6、10、15、21、28,并且该模式将始终匹配
F(x) = 1/2 x N x (N+1)
希望这有帮助我的第一个建议是测试它-它是代码,它是要运行的
public static void runMe(int N) {
int counter = 0;
for(int x=0;x<N;x++){
for(int y=x;y<N;y++){
counter ++; // replacing the print
}
}
System.out.println(counter);
}
您可以看到,这对应于(N+1)*N/2=i=1到N之间i的和。但是有一种更好的几何方法来看待这一点。让我们用星号替换数字:
public static void runMe(int N) {
int counter = 0;
for(int x=0;x<N;x++){
for(int y=x;y<N;y++){
System.out.print("*");
}
System.out.println();
}
}
底边为8、高度为8的三角形。三角形的面积为底边x高度/2。8*9/2=4*9=36(接受高度或宽度+1以固定圆角:它毕竟不是一个完全平滑的三角形)。几何图形获胜
如果你还记得三角形面积的几何解释,它也适用于这里(它解释了+1):让我们剪切和折叠三角形:
********/*
*******/**
******/***
*****/****
这就是:使用偶数N,切割下三角形,旋转它,它将与上三角形很好地匹配。N/2行中的每一行N+1=(N+1)*N/2
对于奇数N,您可以保持第一行不变:这是N=7的输出
*******
******
*****
****
***
**
*
折叠后:(N+1)/2*N=(N*1)*N/2=28
*******/
******/*
*****/**
****/***
当你运行它时会发生什么?真是个问题!a+,为了方便,方程式是0.5*(N^2+N)。因为这个答案是错误的,所以请投反对票。此外,他不是问计算时间,而是问它将被打印的确切次数。我已经解决了这个问题(事实上,我认为否决票发生在我在扩展0.5*N*(N+1)
时出错之前),他确实明确询问了Big-O复杂性!我错过了Big-O复杂性。这一部分是正确的。@lacraig2同样,像这样的小错误通常应该被注释,以便得到修复,而不是否决票
*******
******
*****
****
***
**
*
*******/
******/*
*****/**
****/***