這感覺應該比現在更容易,但如果我有價值觀 ABC 我可以擁有
AAA
AAB
等等
ACB
CCA
等等
有沒有一種簡單的方法可以用 c#、javascript、python 或偽代碼來計算它們?我基本上想要一個二維陣列,一個維度的所有組合和另一個維度的值。
uj5u.com熱心網友回復:
您計算 N 位數字的所有方法實際上是將每個數字添加到您計算 N-1 位數字的所有方法之前。所有你計算 1 位數的方法,就是所有的數字。
接著就,隨即...
function nCombosOfABC(nDigits) {
if (nDigits === 1) return ['A', 'B', 'C']
let result = []
let n1 = nCombosOfABC(nDigits-1)
for (let r of n1) {
for (let letter of ['A', 'B', 'C']) {
result.push([letter, ...r])
}
}
return result
}
console.log(nCombosOfABC(3))
或者,作為評論中提出的建議,更直接的添加(以小端基數 3)...
const addOne = string => {
const adder = { A: { value: 'B' }, B: { value: 'C' }, C: { value: 'A', carry: true } }
const digits = string.split('');
const sum = adder[digits[0]];
return sum.carry ? sum.value addOne(digits.slice(1).join('')) : [sum.value, ...digits.slice(1)].join('')
}
for (let n = "AAA"; n != "CCC"; n = addOne(n)) {
console.log(n)
}
console.log("CCC")
uj5u.com熱心網友回復:
所以對于那些想知道的人來說,這是一個粗略的解決方案?這樣做的目的是生成大小和類別組合的內核的每個組合。
public static float[][] GenerateCombinations(int size, float[] categories)
{
List<float[]> combinations = new List<float[]>();
var totalKernels = (int)Math.Pow(categories.Length, size);
var currentIndexes = new int[size];
var firstOutput = new float[size];
combinations.Add(firstOutput);
for (var i = 1; i < totalKernels; i )
{
Console.Write("\n");
var output = new float[size];
var carry = 0;
for (var j = 0; j < size; j )
{
if (j == 0)
{
currentIndexes[j] ;
}
if (carry != 0)
{
currentIndexes[j] = carry;
carry = 0;
}
if (currentIndexes[j] >= categories.Length)
{
carry = 1;
output[j] = categories[0];
currentIndexes[j] = 0;
}
else
{
output[j] = categories[currentIndexes[j]];
}
Console.Write($" {output[j]}");
}
combinations.Add(output);
}
return combinations.ToArray();
}
uj5u.com熱心網友回復:
這是python中的幾種不同方法
三重嵌套回圈
我們通過迭代第一個元素的所有可能值、迭代第二個元素的所有可能值和迭代第三個元素的所有可能值來找到所有可能的三元組。
- 優點:非常易于理解和編碼;
- 缺點:每個元組的元素數量是硬編碼的;如果我們想要成對或四胞胎或五胞胎而不是三胞胎,我們需要一個不同的函式。
def all_triplets(seq):
for x in seq:
for y in seq:
for z in seq:
yield (x,y,z)
print(list(all_triplets('AB')))
# [('A', 'A', 'A'), ('A', 'A', 'B'), ('A', 'B', 'A'), ('A', 'B', 'B'), ('B', 'A', 'A'), ('B', 'A', 'B'), ('B', 'B', 'A'), ('B', 'B', 'B')]
print(list(all_triplets('ABC')))
# [('A', 'A', 'A'), ('A', 'A', 'B'), ('A', 'A', 'C'), ('A', 'B', 'A'), ('A', 'B', 'B'), ('A', 'B', 'C'), ('A', 'C', 'A'), ('A', 'C', 'B'), ('A', 'C', 'C'), ('B', 'A', 'A'), ('B', 'A', 'B'), ('B', 'A', 'C'), ('B', 'B', 'A'), ('B', 'B', 'B'), ('B', 'B', 'C'), ('B', 'C', 'A'), ('B', 'C', 'B'), ('B', 'C', 'C'), ('C', 'A', 'A'), ('C', 'A', 'B'), ('C', 'A', 'C'), ('C', 'B', 'A'), ('C', 'B', 'B'), ('C', 'B', 'C'), ('C', 'C', 'A'), ('C', 'C', 'B'), ('C', 'C', 'C')]
遞回關系
我們不使用嵌套回圈,而是使用笛卡爾積的遞推關系:
product(seq with itself n times) == product(seq, product(seq with itself n-1 times))
我們仍將迭代第一個元素的所有可能值;但不是使用硬編碼的嵌套回圈來迭代剩余元素的所有可能值,我們將使用遞回關系來獲取剩余元素的可能值。
與所有遞推關系一樣,它可以很容易地用于撰寫迭代函式或遞回函式。由于python在遞回方面非常糟糕,這里有一個迭代版本。
- 優點:每個元組的元素數現在是一個引數;
- 缺點:這比硬編碼的嵌套回圈更難理解。
def all_n_uplets(seq, n):
'''assume n >= 1'''
result = seq
for _ in range(n-1):
result = [ (x, *t) for x in seq for t in result ]
return result
print(all_n_uplets('ABC', 2))
# [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
print(all_n_uplets('ABC', 3))
# [('A', 'A', 'A'), ('A', 'A', 'B'), ('A', 'A', 'C'), ('A', 'B', 'A'), ('A', 'B', 'B'), ('A', 'B', 'C'), ('A', 'C', 'A'), ('A', 'C', 'B'), ('A', 'C', 'C'), ('B', 'A', 'A'), ('B', 'A', 'B'), ('B', 'A', 'C'), ('B', 'B', 'A'), ('B', 'B', 'B'), ('B', 'B', 'C'), ('B', 'C', 'A'), ('B', 'C', 'B'), ('B', 'C', 'C'), ('C', 'A', 'A'), ('C', 'A', 'B'), ('C', 'A', 'C'), ('C', 'B', 'A'), ('C', 'B', 'B'), ('C', 'B', 'C'), ('C', 'C', 'A'), ('C', 'C', 'B'), ('C', 'C', 'C')]
標準庫
笛卡爾積已經在 python 中實作:它的函式product在 module 中itertools。它可用于計算幾個不同序列的笛卡爾積,或一個序列與自身的笛卡爾積。
- 優點:它已經存在,無需重新實作輪子;
- 缺點:名稱
itertools.product特定于 python,如果你想使用另一種語言,你需要尋找等效的。
from itertools import product
print(list(product('ABC', repeat=3)))
# [('A', 'A', 'A'), ('A', 'A', 'B'), ('A', 'A', 'C'), ('A', 'B', 'A'), ('A', 'B', 'B'), ('A', 'B', 'C'), ('A', 'C', 'A'), ('A', 'C', 'B'), ('A', 'C', 'C'), ('B', 'A', 'A'), ('B', 'A', 'B'), ('B', 'A', 'C'), ('B', 'B', 'A'), ('B', 'B', 'B'), ('B', 'B', 'C'), ('B', 'C', 'A'), ('B', 'C', 'B'), ('B', 'C', 'C'), ('C', 'A', 'A'), ('C', 'A', 'B'), ('C', 'A', 'C'), ('C', 'B', 'A'), ('C', 'B', 'B'), ('C', 'B', 'C'), ('C', 'C', 'A'), ('C', 'C', 'B'), ('C', 'C', 'C')]
print(list(product('ABC', 'ABC', 'ABC')))
# [('A', 'A', 'A'), ('A', 'A', 'B'), ('A', 'A', 'C'), ('A', 'B', 'A'), ('A', 'B', 'B'), ('A', 'B', 'C'), ('A', 'C', 'A'), ('A', 'C', 'B'), ('A', 'C', 'C'), ('B', 'A', 'A'), ('B', 'A', 'B'), ('B', 'A', 'C'), ('B', 'B', 'A'), ('B', 'B', 'B'), ('B', 'B', 'C'), ('B', 'C', 'A'), ('B', 'C', 'B'), ('B', 'C', 'C'), ('C', 'A', 'A'), ('C', 'A', 'B'), ('C', 'A', 'C'), ('C', 'B', 'A'), ('C', 'B', 'B'), ('C', 'B', 'C'), ('C', 'C', 'A'), ('C', 'C', 'B'), ('C', 'C', 'C')]
請注意,搜索庫函式會迫使您采用與社區使用的詞匯表一致的詞匯表。區分以下概念:
- 笛卡爾積,或“替換組合”;
- powerset,或“所有子集的集合”;
- 排列;
- 組合(無需更換);
- 精神錯亂;
- 不同的排列(對于有重復的序列);
- 等等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/378449.html
下一篇:.htaccess重定向屬性
