我有一个数组/数字列表。每个数字都有一定的优先级/重要性。
我需要一种生成所有数字组合的算法,但从最重要的数字开始。
e.g. [number, priority]: [1,1], [2,3], [3,2]. Highest priority is 1.
组合:
1, 3, 2, 1 1, 1 3, 3 3, 3 1, 1 2, 3 2, 2 1, 2 2, 1 1 1, 1 1 3, 1 3 1...
知道怎么做吗?当然,我想生成一定数量的组合。
我有一个数组/数字列表。每个数字都有一定的优先级/重要性。
我需要一种生成所有数字组合的算法,但从最重要的数字开始。
e.g. [number, priority]: [1,1], [2,3], [3,2]. Highest priority is 1.
组合:
1, 3, 2, 1 1, 1 3, 3 3, 3 1, 1 2, 3 2, 2 1, 2 2, 1 1 1, 1 1 3, 1 3 1...
知道怎么做吗?当然,我想生成一定数量的组合。
似乎您正在寻找所有组合而不是所有排列(我没有看到任何重复的数字集,因此您只关心数字集而不关心该集合中的顺序)。
这是给您的提示 - 首先写下将产生数字 1 到 n 的所有可能组合的代码,然后在这些数字和您给出的考虑权重的数字之间进行简单的双射。
我将答案更改为示例代码,这样您甚至不需要递归。您必须首先按优先级对元素进行排序。该示例是在 Perl 中,它与 Pseudocode 相距不远
@numbers = (1, 3, 2, 4);
push(@result, @numbers);
push(@working_list, @numbers);
for ($i = 1; $i < @numbers; $i++) { # We loop exactly for the length of the array (-1 because the first iteration is already inside)
my @result_list;
for $result (@working_list) { # get the result of the last iteration of $i
for $number (@numbers) { # iterate the numbers
push (@result_list, "$result $number"); # adding the numbers
}
}
push(@result, @result_list); # push the last result to final result list
undef @working_list;
push(@working_list, @result_list); # use the last result as a start point for next $i iteration
}
print join(', ', @result);