【发布时间】:2020-10-27 04:06:47
【问题描述】:
我有一个长度可能为 6 或更多(+6 光子/伽马)的可能对象列表,我需要从该列表中制作 3 对(3 个π介子)。这些对都需要具有唯一的对象,并且一旦成对,任何伽玛都不能重复使用。
例如如果 pion1 由 gamma1(在代码中:ig1)和 gamma2 (ig2) 制成,则 pions2 和 pions3 必须由 gammas3、4、5、6 等的所有可能组合制成(可能超过 6伽马,但我只关心总共 3 个π介子),等等。
我尝试按以下方式执行下几个 for 循环:
int n_g = 8; // n_g >= 6
boolean hasDVPi0P = false;
for (int ig1 = 0; ig1 < n_g-5 && !hasDVPi0P ; ig1++) {
for (int ig2 = ig1+1; ig2 < n_g-4 && !hasDVPi0P ; ig2++) {
for (int ig3 = ig2+1; ig3 < n_g-3 && !hasDVPi0P ; ig3++) {
for (int ig4 = ig3+1; ig4 < n_g-2 && !hasDVPi0P ; ig4++) {
for (int ig5 = ig4+1; ig5 < n_g-1 && !hasDVPi0P ; ig5++) {
for (int ig6 = ig5+1; ig6 < n_g && !hasDVPi0P ; ig6++) {
System.out.println("(" + ig1 + "," + ig2 + ") , (" + ig3 + "," + ig4 + ") , (" + ig5 + "," + ig6 + ")");
}
}
}
}
}
}
这让我得到以下输出:
(0,1) , (2,3) , (4,5)
(0,1) , (2,3) , (4,6)
(0,1) , (2,3) , (4,7)
(0,1) , (2,3) , (5,6)
(0,1) , (2,3) , (5,7)
(0,1) , (2,3) , (6,7)
(0,1) , (2,4) , (5,6)
(0,1) , (2,4) , (5,7)
(0,1) , (2,4) , (6,7)
(0,1) , (2,5) , (6,7)
(0,1) , (3,4) , (5,6)
(0,1) , (3,4) , (5,7)
(0,1) , (3,4) , (6,7)
(0,1) , (3,5) , (6,7)
(0,1) , (4,5) , (6,7)
(0,2) , (3,4) , (5,6)
(0,2) , (3,4) , (5,7)
(0,2) , (3,4) , (6,7)
(0,2) , (3,5) , (6,7)
(0,2) , (4,5) , (6,7)
(0,3) , (4,5) , (6,7)
(1,2) , (3,4) , (5,6)
(1,2) , (3,4) , (5,7)
(1,2) , (3,4) , (6,7)
(1,2) , (3,5) , (6,7)
(1,2) , (4,5) , (6,7)
(1,3) , (4,5) , (6,7)
(2,3) , (4,5) , (6,7)
我最初认为是正确的直到我检查了 n_g=6,这让我明白了
(0,1) , (2,3) , (4,5)
这显然是错误的输出。我尝试通过以下方式找到 6 gamma 的所有唯一可能对:
n_g=6;
for(int ig1 = 0; ig1 < n_g-1; ig1++) {
for(int ig2 = ig1+1; ig2 < n_g; ig2++) {
System.out.print("(" + ig1 + "," + ig2 + ") ");
}
System.out.println("");
}
这给了我
(0,1) (0,2) (0,3) (0,4) (0,5)
(1,2) (1,3) (1,4) (1,5)
(2,3) (2,4) (2,5)
(3,4) (3,5)
(4,5)
有没有人知道我将如何用 6 个 for 循环编辑第一个代码段以获得 3 对 pions,如果 gamma 用于 1 个 pion,它不会再次重复?对中的顺序确实很重要,这意味着如果一对是 (0,1),那么对 (1,0) 是不同的并且不可互换。
【问题讨论】:
标签: java for-loop combinatorics