斐波拉契数列

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)。

  

转载于:https://www.cnblogs.com/maomaohhmm/archive/2012/09/09/2678080.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值