python编写程序计算1+2+3+......+100和_Python3:计算两个列表总和为100的所有排列的最有效方法是什么?...

这篇博客探讨了如何优化Python程序来计算两个列表元素之和为100的所有可能排列,通过递归和不同的排列生成方法减少计算量,提高效率。
摘要由CSDN通过智能技术生成

优化这种方法的方法不是找出更快的方式来生成排列,而是生成尽可能少的排列。

首先,如果您只想要按排序顺序的组合,您将如何做到这一点?

您不需要生成0到100的所有可能组合,然后对其进行过滤。第一个数字a可以是0到100之间的b任何数字。第二个数字可以是0到(100-a)之间的任何值。第三个数字,c只能是100-ab。所以:for a in range(0, 101):

for b in range(0, 101-a):

c = 100-a-b

yield a, b, c

现在,而不是产生100*100*100组合过滤下来到100*50*1+1,我们只是生成100*50*1+1,为2000X加速。

但是,请记住,仍有X * (X/2)**N答案。因此,X * (X/2)**N及时计算它们而不是X**N最佳 - 但它仍然是指数时间。而且没有办法解决这个问题; 毕竟,你想要一个指数的结果。

你可以寻找方法让第一部分itertools.product与reduceor 结合起来更简洁accumulate,但我认为它最终会降低可读性,并且你希望能够扩展到任意任意N,并且还能得到所有的排列,而不仅仅是排序的。所以,在你这样做之前保持它是可以理解的,然后在你完成之后寻找方法来压缩它。

你显然需要经历N步骤。我认为使用递归比循环更容易理解。

当n为1时,唯一的组合是(x,)。

否则,对于从0到x的每个值a,您可以将该值与总和为xa的n-1个数的所有组合一起使用。所以:def sum_to_x(x, n):

if n == 1:

yield (x,)

return

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值