复发关系中是否有可能出现负复发项?

时间:2015-10-06 18:35:35

标签: algorithm

以下是递归关系

T(n)=T(n-1) - T(n-2)

如果有可能那么它的伪代码是什么?

让我们举一个例子 -

main()
{
int n=9;
int result1 = fact(n-1);
int result2 =fact(n-2);
}

function int fact(int n)
{
if(n==0)
return 1;
else
return n*fact(n-1);;
}

这里的递归关系为T(n) = T(n-1) + T(n-2)

但是T(n) = T(n-1) - T(n-2)的伪代码是什么?

4 个答案:

答案 0 :(得分:2)

递归关系可以用于很多事情,而不仅仅是复杂性估计。

但是对于复杂度估计,当你得到一个递归关系时,你肯定会误用它们,比如T(n)= T(n-1) - T(n-2)。

当然你可以写一个程序,如:

function fib(int n)
{
    if (n == 0) return 1;
    if (n == 1) return 1;

    return fib(n-1) - fib(n-2);
}

但请注意,您仍然需要将来自fib(n-1)的调用添加到fib(n-2),因为您调用它们,因此您的T(n)= T(n-1)的递归关系 - T(n-2)对程序没有意义。

至于Eric J.给出的例子,他给出了一个计算某些东西的公式,但是我上面给出的程序的复杂性仍然是O(2 ^ n),因为你必须添加操作计数,因为 svs 在评论中说。

              fib(n)
               /\
        fib(n-1) fib(n-2)
           /\       /\
   fib(n-2)  fib(n-3) fib(n-4)
...............................

以上是两种情况下的函数调用图,无论是否存在负数。

PS:我不是故意让2条边进入fib(n-3),我想分别写下fib(n-3),但我觉得这样看起来更好

上面的程序没有计算Fibonacci序列,我只是通过减去它来修改它。

答案 1 :(得分:1)

看起来像是不可能的。让等式1为:

  

T(n)= T(n-1)-T(n-2)

和等式2:

  

T(n-1)= T(n-2)-T(n-3)

添加等式1和2给出,

  

T(n)= - T(n-3)

因此, T(n)= T(n-3)= 0 或者 这种重复是不可能编码的。

答案 2 :(得分:0)

当然,这可能是通过计算Fibonacci Sequence

最广为人知的

你从

开始

0,1

并通过添加前两个术语来获得后续条款。

T(2)= T(1)+ T(0) T(2)= 1

0,1,1

T(3)= T(2)+ T(1) T(3)= 1 + 1 = 2

0,1,1,2

  

但是T(n)= T(n-1) - T(n-2)的伪代码是什么

这是Fibonacci序列的代码T(n)= T(n-1)+ T(n-2)。如果您希望在示例中减去术语,只需将+更改为 - 。

function fib(int n)
{
    if (n == 0) return 1;
    if (n == 1) return 1;

    return fib(n-1) + fib(n-2);
}

答案 3 :(得分:0)

假设n> = 0:

// base cases
T(0) :
  return T0
T(1) :
  return T1

// recurrence relation
T(n) :
  return T(n-1) - T(n-2)

前几个词是:

0:  T0
1:  T1
2:  T1 - T0
3:  -T0
4:  -T1
5:  -T1 + T0
6:  T0
7:  T1

...归结为:

U(0) = U0
U(1) = U1
U(2) = U1 - U0
// borrowing from @displayName's answer
U(n) = -U(n-3)
// or
T(n) = (-1)^(floor(n/3)) * U(mod(n,3))

(-1)^floor(n/3)一词将导致它交替,sign(T(n))为零或偶数时floor(n/3)为正,否则为负。 mod(n,3)使其重复序列。