1
22
如果n离r不远,那么使用组合的递归定义可能更好,因为xc0==1,您将只有几个迭代: 这里的相关递归定义是: n c r=(n-1)c(r-1)*n/r 这可以通过以下列表使用尾部递归很好地计算出来: [(n-r,0),(n-r+1,1),(n-r+2,2),…,(n-1,r-1),(n,r)]
当然,它很容易在python中生成(我们省略了nc0=1以来的第一个条目)。
现在我们只需要使用带reduce的tail递归来应用递归步骤。我们从1开始,因为nc0是1,然后将当前值与列表中的下一个条目相乘,如下所示。
|
2
16
两个相当简单的建议:
|
3
6
如果您不需要纯Python解决方案,
gmpy2
可能会有帮助(
|
4
6
在scipy中有一个函数,这个函数还没有提到:
scipy.special.comb
. 根据你的医生测试的一些快速计时结果(大约0.004秒
[虽然这个特定的问题似乎是关于算法的问题 is there a math ncr function in python 标记为此的副本…] |
5
3
如果您的问题不需要知道排列或组合的确切数目,那么您可以使用 Stirling's approximation 对于阶乘。 这将导致如下代码:
|
6
2
如果您正在计算n choose k(我认为您正在使用ncr),那么有一个动态编程解决方案可能会更快。这将避免使用阶乘,另外,如果希望以后使用,还可以保留表。 以下是它的教学链接: http://www.csc.liv.ac.uk/~ped/teachadmin/algor/dyprog.html 不过,我不确定如何更好地解决你的第一个问题,对不起。 编辑:这是模型。有一些相当搞笑的一次性错误,所以它肯定能忍受一些更干净。
|
7
1
应该允许您计算组合 |
8
1
更有效的NCR解决方案-空间和精度方面。 中介(Res)保证始终为int,且不会大于结果。空间复杂度是O(1)(没有列表,没有压缩文件,没有堆栈),时间复杂度是O(R)-正是R乘和R除。
|
9
0
使用
|
10
0
对于n,选择k,可以使用帕斯卡三角形。基本上,您需要保留大小为n的数组来计算所有n选择k值。只需要添加。 |
11
0
您可以输入两个整数并导入数学库以查找阶乘,然后应用ncr公式
|
12
0
|
Wizard · 创建特定排列Python 6 年前 |
RyanP · JAVA的置换生成器方法分析 6 年前 |
stavrop · 如何从项目列表中获得顺序排列? 6 年前 |
Askold Ilvento · 在Eigen中应用逆换位 6 年前 |
Gabriel · 计算2个向量之间的断点距离 6 年前 |
Kuba KrzyżyÅski · 打印置换树python3 6 年前 |