如何找出nCr函数的调用次数

时间:2011-09-22 10:15:24

标签: algorithm

以下递归方程的解决方案是什么?

T(n,0)= 1,
T(n,n)= 1,
T(n,r)= T(n-1,r-1)+ T(n-1,r)+ 1

我在尝试找出函数nCr的调用次数时得到了这个,在下面的nCr定义中

int nCr ( int n, int r ) {
  if( n == r || r == 0 ) 
    return 0;
  return nCr( n-1, r-1 ) + nCr( n-1, r );
}

这个递归方程是否适用于此目的?

5 个答案:

答案 0 :(得分:1)

我认为你的递归方程是完全正确的(你定义的函数确实总是返回0,但它与所做的调用次数无关。)

为了解决这个问题,您应该看到Pascal's triangle背后的递归非常接近,因此T(n,r)的值应该与binomial coefficient C(n,r)相关联

如果你试着写下这个新三角形的前几行,你会得到:

1
1 1
1 3 1
1 5 5 1
1 7 11 7 1
1 9 19 19 9 1
1 11 29 39 29 11 1 
...

从这里你可以使用OEIS,或者自己找出T(n,r) = 2 * C(n,r) - 1

然后您可以使用归纳来证明它:如果r = 0r = n,则关系为真,否则

T(n,r) = T(n-1,r) + T(n-1,r-1) + 1
       = (2 * C(n-1,r) - 1) + (2 * C(n-1,r-1) - 1) + 1
       = 2 * (C(n-1,r) + C(n-1,r-1)) - 1
       = 2 * C(n,r) - 1

希望这有帮助。

答案 1 :(得分:1)

不应该是

int nCr ( int n, int r ) {
  if( n == r || r == 0 ) 
    **return 1;**
  return nCr( n-1, r-1 ) + nCr( n-1, r );
}

答案 2 :(得分:0)

我认为你是在正确的轨道(认真),除了你的功能总是返回零。尽管如此,这仍然很容易解决。

答案 3 :(得分:0)

这里有一个解决与多个变量的递归关系的教程。 papir铅笔法。 http://www.cs.ucr.edu/~jiang/cs141/recur-tut.txt

如果您想知道调用函数的次数,可以简单地添加一个计数器

int counter = 0;
int nCr ( int n, int r ) {
  counter++;
  if( n == r || r == 0 ) 
    return 0;
  return nCr( n-1, r-1 ) + nCr( n-1, r );
}

答案 4 :(得分:0)

(正如其他人所指出的,返回值应为1。)

函数调用的结果基本上是nCr(n,r)= 1 + 1 + 1 + ... + 1 + 1。
返回1的呼叫总数是上述总和中的1的数量,nCr(n,r) 添加两个值的调用总数是上述总和中的+的数量,nCr(n,r)-1。
因此,函数调用的总数是2 * nCr(n,r)-1。