剑指Offer—编程题9(斐波那契数列)



O(n)时间O(1)空间实现:

[java]  view plain  copy
 print ?
  1. public class Test09 {  
  2.   
  3.     /** 
  4.      * 写一个函数,输入n,求斐波那契(Fibonacci) 数列的第n项 
  5.      * @param n Fibonacci数的项数 
  6.      * @return 第n项的结果 
  7.      */  
  8.     public static long fibonacci(int n) {  
  9.   
  10.         // 当输入非正整数的时候返回0  
  11.         if (n <= 0) {  
  12.             return 0;  
  13.         }  
  14.   
  15.         // 输入1或者2的时候返回1  
  16.         if (n == 1 || n == 2) {  
  17.             return 1;  
  18.         }  
  19.   
  20.         // 记录前两个(第n-2个)的Fibonacci数的值  
  21.         long prePre = 1;  
  22.         // 记录前两个(第n-1个)的Fibonacci数的值  
  23.         long pre = 1;  
  24.         // 记录前两个(第n个)的Fibonacci数的值  
  25.         long current = 2;  
  26.   
  27.         // 求解第n个的Fibonacci数的值  
  28.         for (int i = 3; i <= n ; i++) {  
  29.             // 求第i个的Fibonacci数的值  
  30.             current = prePre + pre;  
  31.             // 更新记录的结果,prePre原先记录第i-2个Fibonacci数的值  
  32.             // 现在记录第i-1个Fibonacci数的值  
  33.             prePre = pre;  
  34.             // 更新记录的结果,pre原先记录第i-1个Fibonacci数的值  
  35.             // 现在记录第i个Fibonacci数的值  
  36.             pre = current;  
  37.         }  
  38.   
  39.         // 返回所求的结果  
  40.         return current;  
  41.     }  
  42.   
  43.     public static void main(String[] args) {  
  44.         System.out.println(fibonacci(0));  
  45.         System.out.println(fibonacci(1));  
  46.         System.out.println(fibonacci(2));  
  47.         System.out.println(fibonacci(3));  
  48.         System.out.println(fibonacci(4));  
  49.         System.out.println(fibonacci(5));  
  50.         System.out.println(fibonacci(6));  
  51.         System.out.println(fibonacci(7));  
  52.     }  
  53. }  

运行结果:


这道题的解法可以应用在青蛙跳台阶的算法上面


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值