2016-03-02 75 views
-4

我需要一个函数来解决以下问题:对于二项函数nCr = k,给定r和k找到n。在数学nCr = n!/ r!(n-r)! 我试过以下,但并没有解决它。例如8C6 = 28,对于我的函数输入是6和28,我想找到8.这可能没有确切的整数,所以我想找到一个x> = n。对于二项函数nCr = k,给定r和k找到n

"""I am approaching it this way, i.e. find the solution of a polynomial function iteratively, hope there is a better way""" 
def find_n(r,k): 
    #solve_for_n_in(n*(n-1)...(n-r)=math.factorial(r)*k 
    #in the above example solve_for_n(n*(n-1)(n-2)(n-3)(n-4)(n-5)=720*28) 

    sum=math.factorial(r)*k 
    n=r+1 
    p=1 

    while p<sum: 
     p=1 
     for i in range(0,r+2): 
      p*=(n-i) 
     n+=1 
    return n-1 

谢谢。

+2

它看起来像你希望我们为你写一些代码。尽管许多用户愿意为遇险的编码人员编写代码,但他们通常只在海报已尝试自行解决问题时才提供帮助。证明这一努力的一个好方法是包含迄今为止编写的代码,示例输入(如果有的话),期望的输出以及实际获得的输出(控制台输出,回溯等)。您提供的细节越多,您可能会收到的答案就越多。检查[FAQ]和[问]。 –

+0

我仍然不知道你的问题是什么?这是否做你想要的?如果没有,请提供有关哪些内容不适用于示例输入和输出的具体细节。 –

+0

例如** 8C6 ** = 28,对于我的功能输入是6和28,我想找到8. –

回答

0

我用下面的方法求解它,即迭代求解多项式函数,希望有更好的办法。

def find_n(r,k): 
    #solve_for_n_in(n*(n-1)...(n-r)=math.factorial(r)*k 
    #in the above example solve_for_n(n*(n-1)(n-2)(n-3)(n-4)(n-5)=720*28) 

    target=math.factorial(r)*k 
    n=r+1 
    p=1 

    while p<target: 
     p=1 
     for i in range(0,r+2): 
      p*=(n-i) 
     n+=1 
    return n-1 
0

下面是使用fminsearch的解决方案。您需要将nchoosek(n, r)k之间的绝对差异降至最低。但是,您可能会遇到nchoosek未定义的值,因此最好从头开始定义它。不要使用factorial,因为它对负整数没有定义。相反,使用gamma(如果您不知道,请阅读维基百科上的这篇文章)。

r = 6; 
k = 28; 
toMinimize = @(n) abs(gamma(n+1)/(gamma(r+1) * gamma(n-r+1)) - k); 

可以智能的初始条件:

for n = 1:10 
    [res(n, 1), fval(n, 1)] = fminsearch(toMinimize, n); 
end 
[res fval] 

现在你会看到,你应该只相信初始条件n0 >= 5,对于这个问题的答案是n = 8

ans = 
      1.42626953125   27.9929874410369 
      1.42626953125   27.9929874410369 
      3.5737060546875   27.9929874410073 
      3.57373046875   27.9929874410369 
         8       0 
      8.00000152587891  5.2032510172495e-05 
      8.00000152587891  5.20325100552554e-05 
         8       0 
      7.99999694824218  0.000104064784270719 
         8       0