12
12
13
13
def combination_lists (n : int , k : int ) -> list [list [int ]]:
14
14
"""
15
+ Generates all possible combinations of k numbers out of 1 ... n using itertools.
16
+
15
17
>>> combination_lists(n=4, k=2)
16
18
[[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
17
19
"""
@@ -20,6 +22,8 @@ def combination_lists(n: int, k: int) -> list[list[int]]:
20
22
21
23
def generate_all_combinations (n : int , k : int ) -> list [list [int ]]:
22
24
"""
25
+ Generates all possible combinations of k numbers out of 1 ... n using backtracking.
26
+
23
27
>>> generate_all_combinations(n=4, k=2)
24
28
[[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
25
29
>>> generate_all_combinations(n=0, k=0)
@@ -34,6 +38,14 @@ def generate_all_combinations(n: int, k: int) -> list[list[int]]:
34
38
ValueError: n must not be negative
35
39
>>> generate_all_combinations(n=5, k=4)
36
40
[[1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 4, 5], [1, 3, 4, 5], [2, 3, 4, 5]]
41
+ >>> generate_all_combinations(n=3, k=3)
42
+ [[1, 2, 3]]
43
+ >>> generate_all_combinations(n=3, k=1)
44
+ [[1], [2], [3]]
45
+ >>> generate_all_combinations(n=1, k=0)
46
+ [[]]
47
+ >>> generate_all_combinations(n=1, k=1)
48
+ [[1]]
37
49
>>> from itertools import combinations
38
50
>>> all(generate_all_combinations(n, k) == combination_lists(n, k)
39
51
... for n in range(1, 6) for k in range(1, 6))
@@ -56,6 +68,28 @@ def create_all_state(
56
68
current_list : list [int ],
57
69
total_list : list [list [int ]],
58
70
) -> None :
71
+ """
72
+ Helper function to recursively build all combinations.
73
+
74
+ >>> create_all_state(1, 4, 2, [], result := [])
75
+ >>> result
76
+ [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
77
+ >>> create_all_state(1, 3, 3, [], result := [])
78
+ >>> result
79
+ [[1, 2, 3]]
80
+ >>> create_all_state(2, 2, 1, [1], result := [])
81
+ >>> result
82
+ [[1, 2]]
83
+ >>> create_all_state(1, 0, 0, [], result := [])
84
+ >>> result
85
+ [[]]
86
+ >>> create_all_state(1, 4, 0, [1, 2], result := [])
87
+ >>> result
88
+ [[1, 2]]
89
+ >>> create_all_state(5, 4, 2, [1, 2], result := [])
90
+ >>> result
91
+ []
92
+ """
59
93
if level == 0 :
60
94
total_list .append (current_list [:])
61
95
return
0 commit comments