生成大小为n的所有列表,使每个元素介于0和m之间(含)

时间:2012-12-21 23:00:09

标签: algorithm list language-agnostic combinatorics exponent

生成所有大小为n的列表,以使每个元素介于0和m之间(包括)。

(m+1)^n个此类列表。

2 个答案:

答案 0 :(得分:2)

这就像枚举n位数的基数(m + 1)中的所有数字一样。

start with a list of n zeros
do the following loop
    yeld the list as a new answer
    increment the first element, counting in base (m+1), and propagate the carry recursively on its next element
    if there is a carry left, exit the loop

更新: 只是为了好玩,什么是解决方案,如果我们添加所有数字必须保持不同的限制(如彩票号码,如最初所述 - 当然我们假设m> = n)?

我们继续列举具有上述限制的所有数字,并且任何元素必须大于列表中的后继数(即等级k < n的数字大于等级{{}的数字1}})。 这是通过简单地检查何时计算当前数字不会变得等于其前任的进位来实现的,并且如果是,则进一步传播进位。

然后,对于枚举所标记的每个列表,计算所有可能的排列。有已知的算法来执行该操作 计算,参见例如Johnson-Trotter algorithm,但可以构建一个更简单的递归算法:

k+1

答案 1 :(得分:2)

编写一般案例有两种简单的方法。一个在@didierc的现有答案中描述。另一种选择是递归。

例如,考虑一个将String作为参数的方法:

if(input string is long enough)
  print or store it
else
  iterate over digit range
    recursive call with the digit appended to the string