Python程序员面试算法宝典---解题总结: 第7章 排列组合与概率 7.3 如何求正整数n所有可能的整数组合

本文是Python程序员面试中关于排列、组合与概率问题的解题总结,重点探讨如何求解正整数n的所有可能整数组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- coding: utf-8 -*-

'''
Python程序员面试算法宝典---解题总结: 第7章 排列组合与概率 7.3 如何求正整数n所有可能的整数组合

题目:
给定一个正整数n,求解出所有和为n的整数组合,要求组合按照递增方式展示,而且唯一。
例如:
4=1+1+1+1、1+1+2、1+3、2+2、4(4+0)

分析:
所求的是所有组合,我记得应该是用回溯算法。
回溯算法的主要思想是:
成功,打印
设置变量
递归
清除变量

对于此题,这里的递归处理应该怎么算
c(n)=c(1) + c(n-1)
c(n-1) = c(1) + c(n-2)
...
c(2) = c(1) + c1(1)
但是这带来一个问题,就是c(2)会被表示为1+1
而不会出现直接为2的情况,因为会一直分解
或者我可以找出2的所有表示方式:
2=1+1,2
那这个应该如何返回。



关键:
1 书上解法
可以用
comb(sums, result, count)
来做递归,sums表示剩余待表达的整数,result是结果列表,count

    # 确定组合中下一个取值的起始范围,确保组合中下一个数字一定不会小于前一个数字
    i = 1 if 0 == count else result[count-1]
    # i最多可以取到sums
    while i <= sums:
        # 设置变量
        result[count] = i
        count += 1
        # 递归
        comb(sums - i, result, count)
        # 清除变量
        count -= 1
        # 找下一个数字做为组合中的数字
        i += 1

2 没有想到
回溯的一种算法式采用累减的方式,减为0,则表示成功。
另外的确需要尝试在一个位置上摆放多个元素,
每次摆放完成,计算下一次递归结果,然后清除当前摆放
然后选择下一次摆放的元素
参考:
Python程序员面试算法宝典
'''

def printResult(result, count):
    if n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值