- 組み合わせの関数:
組み合わせは、与えられた要素の中から重複を許さずにいくつかの要素を選ぶ方法です。以下のDartコードは、再帰を使用して組み合わせを生成する関数の例です。
List<List<T>> combinations<T>(List<T> elements, int k) {
if (k == 0) {
return [[]];
}
if (elements.isEmpty) {
return [];
}
final element = elements.first;
final rest = elements.sublist(1);
final combinationsWithoutElement = combinations(rest, k);
final combinationsWithElement = combinations(rest, k - 1)
.map((combination) => [element, ...combination]);
return [
...combinationsWithoutElement,
...combinationsWithElement,
];
}
この関数は、elements
リストから長さk
の組み合わせのリストを生成します。
- 順列の関数:
順列は、要素の順序が異なる場合に異なる組み合わせを生成する方法です。以下のDartコードは、再帰を使用して順列を生成する関数の例です。
List<List<T>> permutations<T>(List<T> elements) {
if (elements.length <= 1) {
return [elements];
}
final permutationsList = <List<T>>[];
for (var i = 0; i < elements.length; i++) {
final element = elements[i];
final rest = elements.sublist(0, i) + elements.sublist(i + 1);
final subPermutations = permutations(rest);
for (var permutation in subPermutations) {
permutationsList.add([element, ...permutation]);
}
}
return permutationsList;
}
この関数は、elements
リストの要素の順列を生成します。