以下是递归关系
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)
的伪代码是什么?
答案 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)
使其重复序列。