是否有一种有效的方法来运行嵌套for循环,避免任何计数器具有相同的值。显然,我可以运行一些if语句,如下所示,但是有更有效的方法吗?
for i = 1 to 20:
for j = 1 to 20:
if (i == j):
continue
else:
for k = 1 to 20:
if (i == k) or (j == k):
continue
else:
do something useful with these different numbers
编辑:变量不可互换,因此[2,1,0]与[0,1,2]不同。 “做一些有用的事情”将对数字进行大约6次数字检查,包括添加,平方和平方根。
谢谢,并对可能不寻常的伪代码(以及不断编辑)表示抱歉。
答案 0 :(得分:1)
这看起来是最有效的方法。如何拥有它有什么问题?
我只是忽略了我无法想到任何理由需要这样做的部分....所以,如果你有特定的情况请分享?除非您尝试将项目与列表中的所有其他项目进行比较(我猜不是吗?)
可以作为
完成list = {1,2,3,4,1,2,3,4} \\where list[0] will return 1, and list.size() will return 8
for(int i = 0; i < list.size()-1; i++){
for(int j = i + 1; j < list.size(); j++){
System.out.println(list[i] + "," + list[j]);
}
}
这样你就不会重复比较你已经比较过的东西了。
三个巢
list = {1,2,3,4,1,2,3,4} \\where list[0] will return 1, and list.size() will return 8
for(int i = 0; i < list.size()-2; i++){
for(int j = i + 1; j < list.size()-1; j++){
for(int k = j + 1; j < list.size(); k++){
System.out.println(list[i] + "," + list[j] + "," + list[k]);
}
}
答案 1 :(得分:0)
这里唯一可以节省效率的是你的循环逻辑。假设你正确实现它,总会有20 * 19 * 18个操作要做。
您将无法找到您提供的有限详细信息的解决方案。什么是“有用的东西”?
如果事实证明,对于该操作,i,j和k的各个值无关紧要,只有3个数字的组合,那么是的,您可以显着提高效率。使用当前设置,您将传入(i,j,k)值(1,2,3)(1,3,2)(2,1,3)(2,3,1)等。
因此,如果你正在寻找组合,而不是排列,你可以修改它以通过6的事实很容易地减少工作量,通过在每个内部循环中开始j大于i,并且k大于j。