我有一个元素列表作为宏,我想生成一个宏,其中包含这些元素的所有可能对,用&符号分隔。例如,有三个元素az
,by
和cx
:
local elementList az by cx
我想动态生成一个包含以下内容的宏pairList:
az&by az&cx by&cx
(一对中两个元素的顺序无关紧要,因此az& by或by& az应该在pairList
中,但不能同时在两者中。)
听起来相当简单,但我不确定如何优雅地做到这一点。 (在我的情况下,我有大约十个元素开始。)
答案 0 :(得分:3)
我同意尼克对这项任务的tuples
建议。下面的例子表明你给出的方法稍微优雅一点。
local elementList a b c d e f g h i j k l
local pairList // initialize the list of pairs
local seenList // initialize the list of elements already seen
foreach first of local elementList {
foreach second of local seenList {
local pairList `pairList' `second'&`first'
}
local seenList `seenList' `first'
}
display "List of unique pairs: `pairList'"
答案 1 :(得分:0)
我不知道如何使用我在其他S.O.上找到的递归算法。线程,所以这里是我的“蛮力”方法。绝对不是最优雅但是工作:
local elementList a b c d e f g h i j k l
local pairList // initialize the list of pairs
foreach first in `elementList' {
foreach second in `elementList' {
// only do something if the elements are not the same
if("`first'" != "`second'") {
local pair `first'&`second' // pair
local pairReverse `second'&`first' // pair in reverse order
// if pair (or its inverse) is not already in the list, add the pair
if(strpos("`pairList'","`pair'") == 0 & strpos("`pairList'","`pairReverse'") == 0 ) {
local pairList `pairList' `pair'
}
}
} // end of loop on second element
} // end of loop on first element
display "List of unique pairs: `pairList'"