python求解x个数字选出n个数字的组合(递归)

76 篇文章 8 订阅
8 篇文章 0 订阅

在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)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值