天道酬勤,学无止境

在三元组中生成所有可能的数字组合?(Generating all possible combinations of numbers in a triplet?)

问题

举例来说,我想构建一个三元组,将 1..100 中的每个数字组合作为一个三元组; IE:

[(0,0,0),(0,0,1),(0,1,1),(1,1,1),(0,0,2),(0,1,2),(0,2,2),(1,2,2)]

..等,直到给定的界限(即:100:给我们最后的三元组(100,100,100)); 在haskell中是否有任何合理的方法可以做到这一点,或者我最好编写一个简单的方法来保存一个边界指针,并递归地增加每个数字直到它等于它右边的数字?

回答1

我认为你的描述最适合列表理解来表达你想要做什么:

[(a, b, c) | c <- [0..100],
             b <- [0..c],
             a <- [0..b] ]
回答2

您说您想要数字 1..100,但在示例中提到了 0。 此外,您说“每个组合”,但没有提及(1,0,0)

[(a,b,c) | m<-[0..100], a<-[0..m], b<-[0..m], c<-[0..m] ]

为避免重复,请按总和的顺序枚举它们:

let l = 100; in [(a,b,c) | m<-[0..3*l],
                           a<-[0..l], b<-[0..l], c<-[0..l],
                           a+b+c == m ]

通过缩小可能的范围,可以加速计算(通过保持相同的结果):

let l = 100; in [(a,b,m-a-b) | m<-[0..3*l],
                               a<-[(max 0 (m-2*l))..(min l m)],
                               b<-[(max 0 (m-a-l))..(min l (m-a))] ]

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 在Matlab中生成矩阵的所有可能组合(Generate All Possible combinations of a Matrix in Matlab)
    问题 在知道该矩阵的元素只能为0或1的情况下,如何生成N * M矩阵的所有可能值? 例如,如果我想要一个2 * 2矩阵,我们得到16个矩阵,它们具有不同的可能组合:[0 0; 0 0],[1 1; 1 1],[1 0; 0 1],[1 1; 0 0],[0 0; 1 1] ...等 回答1 使用dec2base- combs = dec2base(0:power(2,N*M)-1,2) - '0' 这将在行中生成所有可能的组合。 因此,要选择任何组合,您需要索引到combs 。 因此,第一个组合[0,0,0,0]在combs(1,:)处可用,最后一个[1,1,1,1]在comb(end,:)处可用。 如果您可能的值来自不同的集合(例如0,1,2,3 ,请进行以下编辑- combs = dec2base(0:power(4,N*M)-1,4) - '0' 如果您要获得与输入矩阵大小相同的组合,请使用此- combs_matshaped = reshape(permute(combs,[3 2 1]),N,M,[]) 这将创建一个3D数组,其中包含与组合数量一样多的2D切片,并且矩阵的每个组合都可以使用三维索引“进行索引”。 例如,如果要获得第一个组合,请使用combs_matshaped(:,:,1) ,对于最后一个,请使用combs_matshaped(:,:,end) 。 回答2
  • 获取字符串或组合的所有可能排列,包括Java中的重复字符(Getting every possible permutation of a string or combination including repeated characters in Java)
    问题 我一直在尝试生成每个可能的4个字符串的列表,这些列表可以由任何给定的字符集组成。 我使用过一个函数,可以从一组字符中生成每4个字符的组合,但是每个字符只能使用一次。 我需要使用给定的一组字符进行所有可能的组合,例如: String[] elements = {"a", "b", "c", "1", "2", "3"}; int[] indices; CombinationGenerator x = new CombinationGenerator (elements.length, 4); StringBuffer combination; while (x.hasMore ()) { combination = new StringBuffer (); indices = x.getNext (); for (int i = 0; i < indices.length; i++) { combination.append (elements[indices[i]]); } System.out.println (combination.toString ()); } 从此处使用CombinationGenerator类,这将返回每个唯一的4个字符的组合,例如: 'abcd' , 'abc1', 'acb2', 'acb1' 但是,我希望可以使用给定的字符创建所有可能的字符串
  • 在python中生成列表的所有组合(Generating all combinations of a list in python)
    问题 这是问题: 给定Python中的项目列表,我将如何获得这些项目的所有可能组合? 这个站点上有几个类似的问题,建议使用itertools.combine,但这仅返回我需要的一个子集: stuff = [1, 2, 3] for L in range(0, len(stuff)+1): for subset in itertools.combinations(stuff, L): print(subset) () (1,) (2,) (3,) (1, 2) (1, 3) (2, 3) (1, 2, 3) 如您所见,它仅按严格顺序返回项目,而不返回(2,1),(3,2),(3,1),(2、1、3),(3、1、2),( 2,3,1)和(3,2,1)。 有一些解决方法吗? 我似乎什么都没想。 回答1 使用itertools.permutations: >>> import itertools >>> stuff = [1, 2, 3] >>> for L in range(0, len(stuff)+1): for subset in itertools.permutations(stuff, L): print(subset) ... () (1,) (2,) (3,) (1, 2) (1, 3) (2, 1) (2, 3) (3, 1) .... 帮助itertools
  • 在Haskell中生成斐波那契数?(Generating Fibonacci numbers in Haskell?)
    问题 在Haskell中,如何基于第n个斐波那契数等于第(n-2)个斐波那契数加第(n-1)个斐波那契数的属性来生成斐波那契数? 我已经看到了: fibs :: [Integer] fibs = 1 : 1 : zipWith (+) fibs (tail fibs) 我不太了解,也不了解它如何生成一个无限列表,而不是一个包含3个元素的列表。 我将如何编写可通过计算实际定义而不用对列表函数做一些真正奇怪的事情来工作的haskell代码? 回答1 这是一个不同且更简单的函数,用于计算第n个斐波那契数: fib :: Integer -> Integer fib 0 = 0 fib 1 = 1 fib n = fib (n-1) + fib (n-2) 您所指的实现基于关于斐波那契中的值如何相互关联(以及Haskell如何根据自身定义数据结构实际上创建无限数据结构)的一些观察结果。 您问题中的函数如下所示: 假设您已经有一个无限的斐波那契数字列表: [ 1, 1, 2, 3, 5, 8, 13, .... ] 该tail这份名单是 [ 1, 2, 3, 5, 8, 13, 21, .... ] zipWith使用给定的运算符将两个list元素逐个元素结合在一起: [ 1, 1, 2, 3, 5, 8, 13, .... ] + [ 1, 2, 3, 5, 8, 13, 21,
  • PHP算法可从单个集合生成特定大小的所有组合(PHP algorithm to generate all combinations of a specific size from a single set)
    问题 我试图推导一种算法,该算法生成特定大小的所有可能组合,例如一个函数,该函数接受一个chars和size数组作为其参数,并返回一个组合数组。 示例:假设我们有一组字符:Set A = {A,B,C} a)大小2的所有可能组合:(3 ^ 2 = 9) AA, AB, AC BA, BB, BC CA, CB, CC b)大小3的所有可能组合:(3 ^ 3 = 27) AAA, AAB, AAC, ABA, ABB, ACC, CAA, BAA, BAC, .... ad so on total combinations = 27 请注意,线对的大小可以大于对等的总大小。 前任。 如果set包含3个字符,则我们还可以创建大小为4的组合。 编辑:还请注意,这与置换不同。 在置换中,我们不能有重复的字符,例如,如果使用置换算法,AA就不会出现。 在统计中,这称为抽样。 回答1 我会使用递归函数。 这是一个带有注释的(有效的)示例。 希望这对您有用! function sampling($chars, $size, $combinations = array()) { # if it's the first iteration, the first set # of combinations is the same as the set of characters if (empty(
  • 在C ++中生成组合(Generating combinations in c++)
    问题 我一直在搜索使用c ++生成组合的源代码。 我为此找到了一些高级代码,但这仅适用于特定数量的预定义数据。 任何人都可以给我一些提示,或者可能是一些产生组合的想法。 例如,假设集合S = {1,2,3,....,n},我们从中选出r = 2。 输入将是n和r 。在这种情况下,程序将生成长度为2的数组,例如5 2输出1 2、1 3等。我在构造算法时遇到了困难。 我花了一个月的时间思考这个问题。 回答1 使用std::next_permutation简单方法: #include <iostream> #include <algorithm> #include <vector> int main() { int n, r; std::cin >> n; std::cin >> r; std::vector<bool> v(n); std::fill(v.end() - r, v.end(), true); do { for (int i = 0; i < n; ++i) { if (v[i]) { std::cout << (i + 1) << " "; } } std::cout << "\n"; } while (std::next_permutation(v.begin(), v.end())); return 0; } 或稍有变化就能以更容易遵循的顺序输出结果:
  • 生成两个列表的所有组合并在python中一一输出(Generating all the combinations of two lists and output them one by one in python)
    问题 我有两个清单 [1, 3, 4] [7, 8] 我想从最小的组合开始生成两个列表的所有组合,比如17,18,37,38,47,48,137,138,147,148......178,378....现在对于每个组合,我必须测试它在某些情况下的存在其他地方,如果我发现该组合存在,那么我将停止组合生成。 例如,如果我看到17存在,那么我将不会生成其他组合。 同样,如果我发现48存在,那么我将不会生成后面的组合。 回答1 这是一个非常丑陋的算法,但它对我有用。 它也不是超级昂贵(当然,期望使用 itertools.combinations(a, i)... 生成所有组合): import itertools def all_combs(a): to_return = [] temp = [] for i in a: temp.append(i) to_return.append(temp) for i in range(2, len(a) + 1): temp = [] for j in itertools.combinations(a, i): s = "" for k in j: s = s + str(k) temp.append(int(s)) #Get all values from the list permutation to_return.append(temp)
  • 如何获得一组可重复元素的所有唯一的n-long组合?(How to get all the unique n-long combinations of a set of duplicatable elements?)
    问题 我发现许多解决方案都以所有可能的顺序组合了一个集合元素,但是它们在每个结果中只使用一次每个元素,而我需要将它们视为可重用。 例如,如果输入元素为{“ a”,“ b”,“ c”},数字为2,则输出为{“ a”,“ a”},{“ a”,“ b”},{ “ a”,“ c”},{“ b”,“ a”},{“ b”,“ b”},{“ b”,“ c”},{“ c”,“ a”},{ “ c”,“ b”},{“ a”,“ c”}。 回答1 假设您有N个输入元素,并且想要一个K长的组合。 您所需要做的就是以N为底数,当然要覆盖所有具有K位数字的数字。 因此,可以说N = {n0,n1,... nN} 您将从数字[n0 n0 ... n0]开始,一直计数到[nN nN ... nN] 如果您需要帮助以了解如何计算其他基数,可以在此处获取 您计算的每个数字都映射到所需的K长组合之一。 我认为一个例子会有所帮助 我会用你的价值观。 N = {a,b,c}因此,我们想以3为底数。由于我们需要2个长整数的组合,因此我们只关心2位数字。 最小的2位数以3为底的数字是00,因此我们从那里开始。 通过以3为底数,我们得到: 00 01 02 10 11 12 20 21 22 好的,现在将这些数字转换成一个组合。 记住,我们的集合是{a,b,c} 因此,每当我们看到0时,它都意味着1。无论何时我们看到1时
  • 在python中生成两项的所有可能长度为n的组合(Generating all possibly length n combinations of two items in python)
    问题 我试图从两个可能的项目生成长度为n的列表。 例如,一个例子可能是长度为4的列表,其中包括零或一个将为0000、0001、0010、0100、1000、1001等。 回答1 使用itertools.product: In [1]: from itertools import product In [2]: list(product((0, 1), repeat=4)) Out[2]: [(0, 0, 0, 0), (0, 0, 0, 1), (0, 0, 1, 0), (0, 0, 1, 1), (0, 1, 0, 0), (0, 1, 0, 1), (0, 1, 1, 0), (0, 1, 1, 1), (1, 0, 0, 0), (1, 0, 0, 1), (1, 0, 1, 0), (1, 0, 1, 1), (1, 1, 0, 0), (1, 1, 0, 1), (1, 1, 1, 0), (1, 1, 1, 1)] 您也可以将整数打印为二进制字符串: In [3]: for i in range(2**4): ...: print('{:04b}'.format(i)) ...: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 回答2
  • 生成非连续组合(Generating non-consecutive combinations)
    问题 我正在尝试创建一个生成器(支持执行 next 的迭代器,可能在 python 中使用 yield),它提供来自 {1,2,...n} 的 r 元素的所有组合(n 和 r 是参数),这样在选定的 r 个元素,没有两个是连续的。 例如,对于 r = 2 和 n= 4 生成的组合为{1,3}, {1,4}, {2, 4} 。 我可以生成所有组合(作为迭代器)并过滤那些不满足条件的组合,但我们将做不必要的工作。 是否有某种生成算法使得next是 O(1)(如果不可能,则为 O(r) 或 O(n))。 返回集合的顺序不相关(并且希望允许 O(1) 算法)。 注意:我已将其标记为 python,但与语言无关的算法也会有所帮助。 更新: 我找到了一种将其映射到生成纯组合的方法! 网络搜索显示 O(1) 是可能的组合(尽管它看起来很复杂)。 这是映射。 假设我们有一个组合x_1, x_2, ... , x_r与x_1 + 1 < x_2, x_2 + 1 < x_3, ... 我们映射到y_1, y_2, ..., y_r如下 y_1 = x_1 y_2 = x_2 - 1 y_3 = x_3 - 2 ... y_r = x_r - (r-1) 这样我们就有了y_1 < y_2 < y_3 ...没有非连续约束! 这基本上相当于从 n-r+1 中选择 r 个元素。 因此,我需要做的就是为
  • 生成数字组合而不重复的算法(algorithm for generating number combinations without repetition)
    问题 我在这里检查了几乎所有类似的帖子,但是我不知道该怎么做。 我正在尝试在C程序中输入数字4,该程序在数组中返回以下数字: 1 2 3 4 12 13 14 23 24 34 123 134 124 1234 更清楚地说:如果输入数字为4,则我要使用数字1-4,并生成所有可能的数字组合(从1位数字组合到4位数字组合),而无需数字重复。 我尝试了以下代码: #include <stdio.h> /* Prints out a combination like {1, 2} */ void printc(int comb[], int k) { printf("{"); int i; for (i = 0; i < k; ++i) printf("%d, ", comb[i] + 1); printf("\\b\\b}\\n"); } int next_comb(int comb[], int k, int n) { int i = k - 1; ++comb[i]; while ((i >= 0) && (comb[i] >= n - k + 1 + i)) { --i; ++comb[i]; } if (comb[0] > n - k) /* Combination (n-k, n-k+1, ..., n) reached */ return 0; /* No more
  • 生成所有可能的组合(Generating all Possible Combinations)
    问题 给定2个数组Array1 = {a,b,c...n}和Array2 = {10,20,15....x}我如何生成所有可能的组合作为字符串a(i)b(j)c( k)n(p)其中 1 <= i <= 10, 1 <= j <= 20 , 1 <= k <= 15, .... 1 <= p <= x 如: a1 b1 c1 .... n1 a1 b1 c1..... n2 ...... ...... a10 b20 c15 nx (last combination) 因此,总的组合总数= array2 = (10 X 20 X 15 X ..X x)的元素乘积array2 = (10 X 20 X 15 X ..X x) 类似于笛卡尔积,其中第二个数组定义第一个数组中每个元素的上限。 以固定数字为例, Array x = [a,b,c] Array y = [3,2,4] 因此,我们将有3 * 2 * 4 = 24个组合。 结果应为: a1 b1 c1 a1 b1 c2 a1 b1 c3 a1 b1 c4 a1 b2 c1 a1 b2 c2 a1 b2 c3 a1 b2 c4 a2 b1 c1 a2 b1 c2 a2 b1 c3 a2 b1 c4 a2 b2 c1 a2 b2 c2 a2 b2 c3 a2 b2 c4 a3 b1 c1 a3 b1 c2 a3 b1 c3 a3 b1
  • 在 Scheme 中生成项链的好简单算法?(Good simple algorithm for generating necklaces in Scheme?)
    问题 长度为 n 的 k 元项链是一个长度为 n 的有序列表,其项目是从长度为 k 的字母表中提取的,它是所有共享轮换排序的列表中按字典顺序排列的第一个列表。 示例: (1 2 3) 和 (1 3 2) 是字母 {1 2 3} 中长度为 3 的项链。 更多信息:http://en.wikipedia.org/wiki/Necklace_(combinatorics) 我想在 Scheme(或您选择的 Lisp)中生成这些。 我找到了一些文件... Savage - 生成项链的新算法 Sawada - 在固定的摊销时间内生成手链 Sawada - 用禁止子串生成项链 ...但其中提供的代码对我来说是不透明的。 主要是因为它们似乎没有传入所需的字母表或长度 (n)。 我正在寻找的方案程序的形式是 (necklaces n '(ab c...))。 我可以通过首先生成 k^n 列表然后过滤掉旋转来轻松生成这些。 但它的内存效率非常低...... 谢谢! 回答1 用于生成项链的 FKM 算法。 PLT 计划。 表演上没那么火爆。 它会将任何内容作为字母表并将内部数字映射到您提供的任何内容上。 似乎是正确的; 没有保证。 我在翻译循环时很懒惰,所以你得到了 for 循环和转义延续的奇怪组合。 (require srfi/43) (define (gennecklaces n alphabet
  • 如何获得多维数组的所有可能组合[重复](How to get all possible combinations of multidimensional array [duplicate])
    问题 这个问题在这里已经有了答案: 数组 PHP 的排列(3 个回答) 8 年前关闭。 好的,这里我有一个多维数组。 它由 3 个数组组成,每个数组有 3 个数字。 $numbers = array( array("1", "2", "3"), array("4", "5", "6"), array("7", "8", "9"), ); 我想从这些数组中生成并列出所有可能的数字组合。 例如,“147”(1 来自第一个数组,4 来自第二个数组,7 来自第三个数组)、“247、347、157、257、357、167、267、367 等。 .” 重要的是第一个数字必须来自第一个数组,第二个数字来自第二个数组,第三个数字来自第三个数组。 我曾尝试使用嵌套的 foreach 循环遍历这些数组,但我无法完全弄清楚,这让我头晕目眩。 希望这是有道理的,任何帮助将不胜感激。 回答1 <?php $numbers = array( array("1", "2", "3"), array("4", "5", "6"), array("7", "8", "9"), ); for ($i=0;$i<3;$i++) { for ($j=0;$j<3;$j++) { for ($k=0;$k<3;$k++) { echo $numbers[0][$i]+" "+$numbers[1][$j]+" "+
  • 在C ++中创建n个项目的所有可能的k个组合(Creating all possible k combinations of n items in C++)
    问题 有N多人编号从1到n 。 我必须编写一个代码,从这些n产生并打印k个人的所有不同组合。 请解释用于此的算法。 回答1 我假设您正在询问组合意义上的组合(也就是说,元素的顺序无关紧要,因此[1 2 3]与[2 1 3] )。 然后,这个想法非常简单,如果您了解归纳法/递归法:要获得所有K元素组合,您首先要从现有人员中选择一个组合的初始元素,然后将该“初始”元素与所有可能的组合“连接”起来的K-1人员是从继承初始元素的元素产生的。 举例来说,假设我们要从5个人的集合中抽取3个人的所有组合。 然后,可以用2个人的所有可能组合来表示3个人的所有可能组合: comb({ 1 2 3 4 5 }, 3) = { 1, comb({ 2 3 4 5 }, 2) } and { 2, comb({ 3 4 5 }, 2) } and { 3, comb({ 4 5 }, 2) } 这是实现此想法的C ++代码: #include <iostream> #include <vector> using namespace std; vector<int> people; vector<int> combination; void pretty_print(const vector<int>& v) { static int count = 0; cout << "combination no "
  • 在 Matlab 中生成包含给定集合中至少一个元素的所有组合(Generating all combinations containing at least one element of a given set in Matlab)
    问题 我使用combnk生成组合列表。 如何生成始终包含特定值的组合子集。 例如,对于combnk(1:10, 2)我只需要包含 3 和/或 5 的组合。有没有一种快速的方法来做到这一点? 回答1 好吧,在您的具体示例中,从集合 {1, ..., 10} 中选择两个整数,使得所选整数之一是 3 或 5 会产生 9+9-1 = 17 个已知组合,因此您可以枚举它们. 一般来说,要从包含整数 m 的整数 {1, ..., n} 中找到所有 n-choose-k 组合,这与找到 (n-1)-choose-(k-1) 相同来自整数 {1, ..., m-1, m+1, ..., n} 的组合。 在matlab中,这将是 combnk([1:m-1 m+1:n], k-1) (即使m是 1 或 n,此代码仍然有效。) 回答2 对于蛮力解决方案,您可以使用 COMBNK 生成所有组合,然后使用函数 ANY 和 ISMEMBER 仅查找包含一个或多个数字子集的那些组合。 以下是使用上述示例的方法: v = 1:10; %# Set of elements vSub = [3 5]; %# Required elements (i.e. at least one must appear in the %# combinations that are generated) c = combnk(v
  • 使用MATLAB重复生成所有组合(Generating all combinations with repetition using MATLAB)
    问题 如何使用MATLAB创建具有给定集合重复的所有k组合(也称为k多重组合或多子集)? 这类似于笛卡尔积,但是仅将其排序不同的两行视为相同(例如,向量[1,1,2]=~=[1,2,1]被视为相同) ,因此生成笛卡尔乘积,然后应用unique(sort(cartesianProduct,2),'rows')应该会产生相同的结果。 示例:调用nmultichoosek(1:n,k)应生成以下矩阵: nmultichoosek(1:3,3) ans = 1 1 1 1 1 2 1 1 3 1 2 2 1 2 3 1 3 3 2 2 2 2 2 3 2 3 3 3 3 3 回答1 我们可以使用Wikipedia文章中提到的双射,该双射将不重复n+k-1 choose k类型的组合映射为n+k-1 choose k到大小为n k多重组合。 我们生成没有重复的组合,并使用bsxfun(@minus, nchoosek(1:n+k-1,k), 0:k-1);映射它们bsxfun(@minus, nchoosek(1:n+k-1,k), 0:k-1); 。 这将导致以下功能: function combs = nmultichoosek(values, k) %// Return number of multisubsets or actual multisubsets. if numel
  • 在Python中生成非重复随机数(Generating non-repeating random numbers in Python)
    问题 好的,这是一个比听起来更棘手的问题之一,所以我转向堆栈溢出,因为我想不到一个好的答案。 这就是我想要的:我需要Python以随机顺序生成一个简单的从0到1,000,000,000的数字列表,以用于序列号(使用随机数,这样您就无法知道已分配了多少个数字或进行了计时攻击也很容易,例如,猜测将要发生的下一个攻击)。 这些数字与链接到它们的信息一起存储在数据库表(索引)中。 生成它们的程序不会永远运行,因此它不能依赖内部状态。 没什么大不了的吗? 只需生成一个数字列表,将它们推入数组并使用Python“ random.shuffle(big_number_array)”,我们就完成了。 问题是我想避免必须存储数字列表(从而读取文件,从顶部弹出一个,保存文件并关闭它)。 我宁愿即时生成它们。 问题是我能想到的解决方案有问题: 1)生成一个随机数,然后检查它是否已被使用。 如果已使用它生成一个新号码,请检查并根据需要重复,直到找到未使用的号码为止。 这里的问题是,我可能会很不幸,并且在得到未使用的数字之前会生成很多已使用的数字。 可能的解决方法:使用大量的数字以减少这种情况的发生(但是我最终得到的是愚蠢的长数字)。 2)生成一个随机数,然后检查它是否已被使用。 如果已使用过,请从该数字中增加或减去一个,然后再次检查,继续重复直到我碰到一个未使用的数字。 问题在于,这不再是随机数
  • 从令牌列表中生成所有可能的字符串(Generate all possible strings from a list of token)
    问题 我有一个令牌列表,例如: hel lo bye 我想生成此类字符串的所有可能组合,例如: hello lohel helbye byehel lobye byelo 语言不重要,有什么建议吗? 我发现 Generating permutations using bash,但这在一行中进行了排列。 回答1 您的示例可以用 Python 编写为 from itertools import combinations print list(combinations(["hel", "lo", "bye"], 2)) 再次将输出合并为字符串: print ["".join(a) for a in combinations(["hel", "lo", "bye"], 2)] 如果您对此功能的实际实现感兴趣,请查看文档。 回答2 itertools.permutations 可以为您做到这一点。 >>> l = ['hel', 'lo', 'bye'] >>> list(itertools.permutations(l, 2)) [('hel', 'lo'), ('hel', 'bye'), ('lo', 'hel'), ('lo', 'bye'), ('bye', 'hel'), ('bye', 'lo')] 或者如果你想要组合,你可以使用 itertools.combinations。
  • 在具有 n 个节点的完整二叉树中生成所有可能的拓扑(Generating all possible topologies in a full binary tree having n nodes)
    问题 我想创建一个完整的二叉树的所有可能的拓扑,它必须正好有 n+1 个叶节点和 n 个内部节点。 我想使用递归创建它,树必须是简单的二叉树,而不是二叉搜索树或 BST。 请建议算法来实现此任务。 示例:具有 4 个叶节点和 3 个内部节点。 N N N / \ / \ /\ N N N N N N /\ /\ /\ /\ N N N N N N N N / \ /\ N N N N PS:有一个类似的线程。如果有人可以在这个线程中详细说明 coproc 建议的树生成算法,这将很有帮助。 提前致谢。 回答1 这是为给定 n 生成所有可能拓扑的代码。 完整二叉树中的节点总数(内部 + 叶节点)是奇数。 如果一棵树是满二叉树,那么它的左子树和右子树也是全二叉树,即左子树和右子树都有奇数个节点。 对于给定的 n,我们像这样生成全二叉树的所有组合 第一次迭代:左侧有 1 个节点,右侧有 1 个根节点,n-2 个。 第二次迭代:左侧有 3 个节点,右侧有 1 个根节点,n-4 个。 第三次迭代:左侧有 5 个节点,右侧有 1 个根节点,n-6 个。 . . . 最后一次迭代:左侧 n-2 个节点,1 个根,右侧 1 个 在每次迭代中,我们找到所有可能的左树和右树。 如果左侧可能有 L 棵完整树,则右侧可能有 R 棵完整树 - 那么树的总数为 L*R public void