Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
笛卡尔形式python程序中的二项式系数_Python_Math_Formula_Binomial Coefficients - Fatal编程技术网

笛卡尔形式python程序中的二项式系数

笛卡尔形式python程序中的二项式系数,python,math,formula,binomial-coefficients,Python,Math,Formula,Binomial Coefficients,我需要帮助来构造python程序 好的,我必须写一个代码,用下面的公式解二项式系数。它基本上说的和从j到i的和是一样的,只是它是乘法。这是二项式定理的推广 那么,有没有人知道如何编写python代码,使用这个公式打印出二项式系数呢。变量是n和i。公式如下: 使用一个变量来累加答案,然后在每次迭代时,将其乘以(n-j+1)/j def选择(n,i): ans=1 对于范围(1,i+1)内的j: ans*=(n-j+1)/j 返回ans 打印(选择(7,5))#21 对于较大的值,此函数将返回in

我需要帮助来构造python程序

好的,我必须写一个代码,用下面的公式解二项式系数。它基本上说的和从j到i的和是一样的,只是它是乘法。这是二项式定理的推广

那么,有没有人知道如何编写python代码,使用这个公式打印出二项式系数呢。变量是n和i。公式如下:


使用一个变量来累加答案,然后在每次迭代时,将其乘以
(n-j+1)/j

def选择(n,i):
ans=1
对于范围(1,i+1)内的j:
ans*=(n-j+1)/j
返回ans
打印(选择(7,5))#21
对于较大的值,此函数将返回
inf
,因为我们使用的是float而不是int。我们可以计算分子和分母,然后对它们执行整数除法:

def选择(n,i):
i=最小值(i,n-i)
数值=1
denom=1
对于范围(1,i+1)内的j:
数字*=(n-j+1)
对于范围(1,i+1)内的j:
denom*=j
返回数字//名称
打印(选择(100000,99940))#1180691979962。。。

请注意,对于如此大的数字,最好使用
i=min(i,n-i)
,因为这可以大大提高性能,
n choose i=n choose(n-i)
,答案可以是如下的蛮力方法

n = 3
i = 2
ans = 1
for j in range(1, i + 1):
    ans *= (n - j + 1) / j
ans
或者,简化一下,这基本上就是你们试图实现的nCr公式。所以

import operator as op
from functools import reduce

def ncr(n, r):
    r = min(r, n-r)
    numer = reduce(op.mul, range(n, n-r, -1), 1)
    denom = reduce(op.mul, range(1, r+1), 1)
    return numer // denom 
如果您使用的是Python 3.8或更高版本,则
comb
模块现在包含在
math
库中。简单地做

from math import comb
comb(3, 2)

到目前为止你都做了些什么?请不要通过破坏你的帖子来为别人做更多的工作。通过在Stack Exchange(SE)网络上发布,您已经在a下授予SE分发内容的不可撤销权利(即,无论您未来的选择如何)。根据SE政策,分发非故意破坏版本。因此,任何故意破坏行为都将恢复原状。请参阅:。如果允许删除,在帖子下方左侧有一个“删除”按钮,但它仅在浏览器中,而不是在移动应用程序中。当i>n/2???@DavidOmanovic时,是否有其他方法可供使用?你是什么意思?此方法适用于大于n/2的i,它是根据您提供的公式实现的。例如,当我不使用n=100000和i=99940时,我会得到inf作为答案,但答案是18069197996257·10^218,为什么会这样,我如何修复它?这不会发生,因为
i>n/2
(在许多小情况下,这是正确的,并且函数返回正确的值),而是因为我们使用浮点而不是整数除法,所以对于足够大的值,结果将转换为
inf
。当i>n/2时,是否有其他方法可以使用???@DavidOmanovic此方法适用于i的所有值,只要它小于n。如果要从
i=n/2
开始,可以初始化
i=n/2
在第一个代码段中。其他两个代码段计算nCr值