在x个数字中选择出n个数字(x大于等于n)的组合,我们其实可以使用递归来生成这些组合的方案,对于当前位置的数字有两种选择:要还是不要,当for循环递归到当前位置的时候表示要当前这个位置的数字,这个位置往下递归返回到这一层的时候尝试for循环的下一个位置的时候表示不要当前位置的数字,往下递归的时候递归的位置是加1的所以这样可以避免重复使用某个数字的情况,对于每个位置都是这样尝试可能的数字所以可以在for循环中进行递归(for循环中进行递归表示的就是要还是不要当前位置的数字):
代码如下:
from typing import List
res = 0
# x,n表示在x个数字中选出n个数字的组合, nums表示原始的数字列表, index表示当前递归的位置, count表示记录当前已经选了多少个数字了, rec列表记录中间递归过程中的结果
def combination(x: int, n: int, rec: List[int], nums: List[int], index: int, count: int):
if count == n:
print(rec)
global res
res += 1
return
# for循环中限定了下标的范围所以不会存在越界的问题
for i in range(index, x):
rec.append(nums[i])
combination(x, n, rec, nums, i + 1, count + 1)
# 回溯, 尝试下一个数字
rec.pop()
if __name__ == '__main__':
# 在控制台接收两个以空格分隔的数字, x,n表示在x个数字中取出n个数字
x, n = map(int, input().split())
nums = [i for i in range(1, x + 1)]
rec = list()
combination(len(nums), n, rec, nums, 0, 0)