1.递归算法:
程序代码:
int fib(int n)
{
if(n < 0)
return -1;
if(n == 0 || n==-1)
return n;
return fib(n-2)+fib(n-1);
}
时间复杂度:fib(n)所耗的时间为T(n),则T(0) = T(1) = O(1),当n>=2时,T(n) = T(n-2)+T(n-1)。由于T(n-1) = T(n-3)+T(n-2)>=T(n-2),因此,T(n) = T(n-2)+T(n-1) <= 2T(n-1),所以,T(n) <= 21T(n-1) <= 22T(n-2) <= --- <= 2n-1T(1) = 2n-1O(1) = O(2n)。
空间复杂度:空间代价主要用于实现递归程序的栈,递归深度为n,所以空间开销为O(n)。
2.非递归算法:
思路:定义一个整数num用来存放结果,使用一个栈,其元素为整数。开始时,令num等于0,将n压入栈中,之后不断循环执行下列语句,知道栈为空:将栈顶元素(记为temp)弹出栈,如果temp是0或1,则令num=num+temp;否则,将temp-1和temp-2依次压入栈。循环结束后,num中存放的就是所要求的值。
程序代码:
int nfib(int n)
{
int num = 0,temp;
PSeqStack pastack;
if (n < 0)
return -1;
if(n == 0 || n== 1)
return n;
pstack = createEmptyStack_seq(); //创建空栈
push_seq(pastack,n); //将n入栈
while(!isEmptyStack_seq(pastack))
{
temp = top_seq(pastack);
pop_seq(pastack);
if(temp == 0 || temp == 1)
num += temp;
else
{
push_seq(pastack,temp-1); //temp-1入栈
push_seq(pastack,temp-2); //temp-2入栈
}
}
free(pastack);
return num;
}
时间复杂度和空间复杂度:与递归算法的开销相似,分别是O(2n)和O(n)。