fib() :递归
fib(n)=fib(n-1)+fib(n-2) : {0,1,1,2,3,5,8…}
int fib(n)
{
return (2>n) ? n : fib(n-1)+fib(n-2);
}
复杂度:
T
(
0
)
=
T
(
1
)
=
1
;
T
(
n
)
=
T
(
n
−
1
)
+
T
(
n
−
2
)
+
1
;
T(0)=T(1)=1; T(n)=T(n-1)+T(n-2)+1;
T(0)=T(1)=1;T(n)=T(n−1)+T(n−2)+1;
令
S
(
n
)
=
[
T
(
n
)
+
1
]
/
2
S(n)=[T(n)+1]/2
S(n)=[T(n)+1]/2
则
S
(
0
)
=
1
=
f
i
b
(
1
)
,
S
(
1
)
=
1
=
f
i
b
(
2
)
S(0)=1=fib(1),S(1)=1=fib(2)
S(0)=1=fib(1),S(1)=1=fib(2)
故
S
(
n
)
=
S
(
n
−
1
)
+
S
(
n
−
2
)
=
f
i
b
(
n
+
1
)
S(n)=S(n-1)+S(n-2)=fib(n+1)
S(n)=S(n−1)+S(n−2)=fib(n+1)
T ( n ) = 2 ∗ S ( n ) − 1 = 2 ∗ f i b ( n + 1 ) − 1 = O ( f i b ( n + 1 ) ) = O ( ∅ n ) T(n)=2*S(n)-1=2*fib(n+1)-1=O(fib(n+1))=O(\emptyset^n) T(n)=2∗S(n)−1=2∗fib(n+1)−1=O(fib(n+1))=O(∅n)
其中
∅
=
(
1
+
5
)
/
2
≈
1.618
\emptyset=(1+\sqrt5)/2\approx1.618
∅=(1+5)/2≈1.618
fib() :动态规划
颠倒计算方向:由自顶而下递归,改为自低而上迭代
f=1;g=0; //fib(-1),fib(0)
while(0<n--)
{
g=g+f;
f=g-f;
}
return g;
算法复杂度:
T
(
n
)
=
O
(
n
)
,
而
且
仅
需
要
O
(
1
)
空
间
T(n)=O(n),而且仅需要O(1)空间
T(n)=O(n),而且仅需要O(1)空间