2

是否有一种有效的方法来运行嵌套的 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 次数字检查,包括对它们进行加法、平方和平方根。

谢谢,对可能不寻常的伪代码(和不断的编辑)感到抱歉。

4

2 回答 2

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]);
    }
}
于 2012-07-12T17:04:13.617 回答
0

您唯一可以在这里节省效率的是您的循环逻辑。假设你正确地实现它,总会有 20*19*18 的操作要做。

您将无法找到您提供的有限详细信息的解决方案。什么是“有用的东西”?

如果事实证明对于该操作,i、j 和 k 的各个值无关紧要,只需 3 个数字的组合,那么是的,您可以显着节省效率。使用当前设置,您将传入 (i,j,k) 值 (1, 2, 3) (1,3,2) (2,1,3) (2,3,1) 等。 .

因此,如果您正在寻找组合,而不是排列,您可以通过在每个内部循环中开始 j 比 i 大一和 k 比 j 大一来修改它以很容易地减少 6 的工作量。

于 2012-07-12T17:22:40.253 回答