亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

java實現斐波那契數列的3種方法

2019-11-26 15:47:10
字體:
來源:轉載
供稿:網友

先說說為什么寫這個吧,這個完全是由去阿里巴巴面試引起的一次慘目忍睹的血案。去面試的時候,由于面試前天晚上11點鐘才到阿里巴巴指定面試城市,找到旅館住下基本都1點多,加上晚上完全沒有睡好,直接導致第二天面試效果很不好(對于那些正在找工作的大蝦們不要向小蝦一下悲劇,提前做好準備還是很重要滴),面試大概進行了一個多小時(面試結束回去的時候基本走路都快睡著了,悲催!!),面試快結束的時候面試官問的我問題就是關于費波那西數列,當時頭腦完全漿糊,只知道要設置三個變量或者用List先初始化,當寫到for循環的時候,腦袋簡直漿糊的不能再漿糊了,沒寫出來,最后只能在面試官的步步誘導下寫出了下面的第一種方式,很不應該呀;從現在來看阿里只是把粗枝大葉的把整個應用的框架搭建起來了,真是變革、挖金的黃金期(有能力的大蝦趕緊去),畢竟阿里巴巴手中99%的數據都是重要數據而向百度這類的主推搜索的巨頭99%數據都是垃圾相比,對于數據分析來說,阿里更能通過對手中掌握的多種多樣的用戶詳細數據進行分析,更能精確定位用戶的品味及需求,為精確推送和精準廣告推送提供更好的服務。如果說騰訊未來的夢想是做用戶生活中的水電氣的話,那阿里可能實現的未來夢想就是用戶的衣食住行外加代收水電氣等等,O(∩_∩)O~還是轉入正題吧。
   對于優秀的算法設計員來說,在程序功能主體實現的基礎上無非關心兩個東西,一個設計算法的時間復雜度,一個是空間復雜度(說白了就是執行一個程序所用的時間和占用的內存空間);在根據不同的應用場景的基礎上,一般充滿智慧的算法設計師會在時間和空間兩個相對矛盾的資源中尋求到平衡點,如實時性要求高的系統一般會以空間資源換取時間或者對于常用到的對象一般會常駐內存以提高響應時間(緩存技術和現在比較流行NoSQL中大多是內存數據庫都是如此),對于內存資源比較寶貴的嵌入式系統而言一般會以時間上的延遲來換取時間。
下面從費波那西數列三個實現上來說說,怎么才能真正設計出真正符合實際應用場景的優秀算法
首先說說費波那西數列:
從文字上說,費波那西數列由0和1開始,之后的費波那西系數就由之前的兩數相加,數列形式如下:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946,………………
在數學上,是以遞歸的方法來定義:
F_0=0
F_1=1
F_n = F_{n-1}+ F_{n-2}

實現需求:輸入序號n返回得到對應費波那西數
程序實現1――函數自迭代

復制代碼 代碼如下:

/**
  * 函數自迭代
  * @Title: fnType1
  * @Description: TODO
  * @param @param n
  * @param @return   
  * @return int
  * @throws Exception
  */
 public int fnType1(int n)throws Exception{
  if(n==0){
   return 0;
  }else if(n==1||n==2){
   return 1;
  }else if(n>2){
   int temp=fnType1(n-1)+fnType1(n-2);
   if(temp<0){
    throw new Exception("Invalid value for int type, too larage");
   }else{
    return temp;
   }
  }else{
   throw new Exception("IllegalArgument value for n,please enter n>=0 ");
  }
 }

此種方式缺點:大量迭代不斷消耗棧空間(搞web開發調試維護的都應該知道服務器棧資源的可貴,如果大量并發調用迭代導致服務器棧資源遲遲得不到回收,而導致web服務器崩潰),效率底,函數自閉性比較弱(優秀的接口應該對輸入輸出可能出現的錯誤信息進行捕捉,并提供清楚明了的處理結果),很容易出現錯誤,調試困難,實際應用中一般不建議使用這種方式,使用時迭代次數也不能超過3次;
程序實現2――時間換空間

復制代碼 代碼如下:

/**
  * 時間換空間
  * @Title: fnType2
  * @Description: TODO
  * @param @param n
  * @param @return   
  * @return int (n<0 return -1,beyond max int size return -2)
  * @throws
  */
 public int fnType2(int n){
  int result=-1;
  int temp1=0;
  int temp2=1;
  for(int index=0;index<=n;index++){
   if(index==0){
    result=temp1;
   }else if(index==1){
    result=temp2;
   }else{
    result=temp1+temp2;
    if(result<0){
     result=-2;
     break;
    }
    temp1=temp2;
    temp2=result;
   }
  }
  return result;
 }

此方法主要使用于:使用場景一:對于對象或變量使用次數比較少,使用一次以后就不會再使用的場景;使用場景二:對于內存資源比較稀缺的實時性要求不是太高的嵌入式系統設計中多會采用此種方式;
程序實現3――空間換取時間

復制代碼 代碼如下:

 private static List<Integer> fnData=new ArrayList<Integer>();
 private static final int maxSize=50000;
 /**
  * 初始化器
  * @Title: setFnData
  * @Description: TODO
  * @param    
  * @return void
  * @throws
  */
 private static  void setFnData(){
  int result=-1;
  int temp1=0;
  int temp2=1;
  for(int index=0;index<=maxSize;index++){
   if(index==0){
    result=temp1;
   }else if(index==1){
    result=temp2;
   }else{
    result=temp1+temp2;
    if(result<0){
     result=-2;
     break;
    }
    temp1=temp2;
    temp2=result;
   }
   fnData.add(result);
  }
 }
 /**
  * 對外接口
  * @Title: getFnData
  * @Description: TODO
  * @param @param n
  * @param @return   
  * @return int <span style="font-family: sans-serif;">(n beyond fnData.size() and n<0 return -1)</span>
  * @throws
  */
 public int getFnData(int n){
  if(fnData.size()==0){
   setFnData();
  }
  if(fnData.size()>n&&n>=0){
   return fnData.get(n);
  }else{
   return -1;
  }
 }

此方法一般用于:對象或變量在程序運行的整個生命周期都存在或頻繁調用的場景,如調用外部WebService接口、抽象持續化層、常用配置文件參數加載等等
測試用例:

復制代碼 代碼如下:

package com.dbc.yangg.swing.test;

import java.util.ArrayList;
import java.util.List;

/**
 * 輸入序號n返回得到對應費波那西數
 * @ClassName: Init
 * @Description: TODO
 * @author guoyang2011@gmail.com
 * @date 2014年1月10日 下午7:52:13
 *
 */
public class Init {
 /**
  * 函數自迭代
  * @Title: fnType1
  * @Description: TODO
  * @param @param n
  * @param @return   
  * @return int
  * @throws Exception
  */
 public int fnType1(int n)throws Exception{
  if(n==0){
   return 0;
  }else if(n==1||n==2){
   return 1;
  }else if(n>2){
   int temp=fnType1(n-1)+fnType1(n-2);
   if(temp<0){
    throw new Exception("Invalid value for int type, too larage");
   }else{
    return temp;
   }
  }else{
   throw new Exception("IllegalArgument value for n,please enter n>=0 ");
  }
 }
 /**
  * 時間換空間
  * @Title: fnType2
  * @Description: TODO
  * @param @param n
  * @param @return   
  * @return int (n<0 return -1,beyond max int size return -2)
  * @throws
  */
 public int fnType2(int n){
  int result=-1;
  int temp1=0;
  int temp2=1;
  for(int index=0;index<=n;index++){
   if(index==0){
    result=temp1;
   }else if(index==1){
    result=temp2;
   }else{
    result=temp1+temp2;
    if(result<0){
     result=-2;
     break;
    }
    temp1=temp2;
    temp2=result;
   }
  }
  return result;
 }
 private static List<Integer> fnData=new ArrayList<Integer>();
 private static final int maxSize=50000;
 /**
  * 空間換時間
  * @Title: setFnData
  * @Description: TODO
  * @param    
  * @return void
  * @throws
  */
 private static  void setFnData(){
  int result=-1;
  int temp1=0;
  int temp2=1;
  for(int index=0;index<=maxSize;index++){
   if(index==0){
    result=temp1;
   }else if(index==1){
    result=temp2;
   }else{
    result=temp1+temp2;
    if(result<0){
     result=-2;
     break;
    }
    temp1=temp2;
    temp2=result;
   }
   fnData.add(result);
  }
 }
 /**
  *
  * @Title: getFnData
  * @Description: TODO
  * @param @param n
  * @param @return   
  * @return int (n beyond fnData.size() and n<0 return -1)
  * @throws
  */
 public int getFnData(int n){
  if(fnData.size()==0){
   setFnData();
  }
  if(fnData.size()>n&&n>=0){
   return fnData.get(n);
  }else{
   return -1;
  }
 }
 /**
  *
  * @Title: main
  * @Description: TODO
  * @param @param argv   
  * @return void
  * @throws
  */
 public static void main(String[] argv){
  Init init=new Init();
  int n=46;
  try {
   System.out.println("Type1="+init.fnType1(n));
  } catch (Exception e) {
   // TODO Auto-generated catch block
   System.out.println(e.getMessage());
  }
  System.out.println("Type2="+init.fnType2(n));
  System.out.println("Type3="+init.getFnData(n));
 }
}

輸出結果:

復制代碼 代碼如下:

Type1=1836311903 
Type2=1836311903 
Type3=1836311903 

對于算法設計,不要盲目遵循概念,概念是死的,人是活的(在這個需要crazy man的時代,有想法比循規蹈矩更有優勢),只用結合具體的應用場景才能設計出優秀的算法和結構。
吐槽一下:個人認為優秀的數據結構設計可以簡化算法設計的復雜度提高代碼的可讀性、程序的擴展性及執行效率;
再吐槽一下:做需求分析的時候應該遵循三點原則:1.從用戶角度及其思維方式分析;2.用戶說的不一定是他們真正想要的;3.用戶說的不一定是對的。做程序開發遵循原則:積極提升自身品味,站在用戶使用角度和使用場景分析功能;例如你做后臺接口開發,你的用戶就是接口調用者,你應該考慮接口功能是什么,使用者在什么情況下會調用,傳入參數可能導致哪些異常,你的接口實現中可能出現哪些異常并對可能出現的異常進行捕獲,清楚明了的輸出,良好的函數自閉性;如果你是搞前臺,那你應該在保證業務實現的基礎上從用戶使用習慣等方面把自己當做使用者來設計UI。很有意思對不,需求、開發多了自然就明白了O(∩_∩)O~。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国内精品在线| 国产91在线视频| 亚洲男人天堂古典| 懂色av中文一区二区三区天美| 国产精品一区二区三区在线播放| 亚洲免费av电影| 国产91精品黑色丝袜高跟鞋| 麻豆乱码国产一区二区三区| 国产精品成人一区二区三区吃奶| 亚洲精品资源在线| 55夜色66夜色国产精品视频| 欧美精品18videos性欧美| 国产精品专区h在线观看| zzijzzij亚洲日本成熟少妇| 国产情人节一区| 另类少妇人与禽zozz0性伦| 亚洲免费视频一区二区| 久久精品亚洲94久久精品| 日韩精品中文字幕久久臀| 久久久久久久一区二区三区| 亚洲va欧美va国产综合剧情| 欧洲亚洲免费在线| 97成人在线视频| 成人黄色午夜影院| 日韩久久午夜影院| 国产97在线观看| 国产美女精品免费电影| 欧美日本高清视频| 亚洲摸下面视频| 欧美成人中文字幕| 精品一区二区三区电影| 欧美成人精品在线| 欧美国产视频日韩| 97人人爽人人喊人人模波多| 久久久精品2019中文字幕神马| 国产精品久久久久久久久久免费| 久久精品国产一区| 国产精品视频一区国模私拍| 国产亚洲xxx| 成人黄色av播放免费| 国产精品久久久久久久久久| 亚洲色图欧美制服丝袜另类第一页| 成人美女av在线直播| 久久艹在线视频| 97在线观看免费| 亚洲网址你懂得| 日韩免费在线视频| 亚洲国产精品久久| 国产精品三级网站| 欧美激情欧美狂野欧美精品| 久久国产天堂福利天堂| 91国内揄拍国内精品对白| 欧美wwwwww| 成人97在线观看视频| 国产精品久久久久不卡| 久久久久99精品久久久久| 97在线视频免费播放| 欧美午夜精品久久久久久人妖| 欧美午夜精品久久久久久人妖| 亚洲老头同性xxxxx| 精品国模在线视频| 亚洲最新中文字幕| 国产亚洲精品久久久优势| 麻豆一区二区在线观看| 久久九九精品99国产精品| 日韩专区在线观看| 91高清视频免费| 欧美日韩视频免费播放| 久久久久成人网| 国内精品久久久久影院优| 国内自拍欧美激情| 国产精品一区二区久久久| 国内精品久久久久影院优| 成人性生交大片免费看视频直播| 日日噜噜噜夜夜爽亚洲精品| 国产精品亚洲片夜色在线| 亚洲精品日韩久久久| 久久精品这里热有精品| 精品视频偷偷看在线观看| 欧美亚洲成人网| 久久精品电影网| 国产一区二区三区在线免费观看| 上原亚衣av一区二区三区| 欧美在线精品免播放器视频| 亚洲第一网站免费视频| 97久久精品人人澡人人爽缅北| 性色av香蕉一区二区| 亚洲视频777| 97超碰国产精品女人人人爽| 91日本在线视频| 欧美在线一区二区视频| 亚洲欧洲激情在线| 国产亚洲一区精品| 懂色av中文一区二区三区天美| 国产精品一区久久| 欧美性视频精品| 久久视频在线观看免费| 欧美精品生活片| 91久久精品国产91久久性色| 国产精品免费视频xxxx| 亚洲精品狠狠操| 欧美黑人国产人伦爽爽爽| 欧美裸体男粗大视频在线观看| 日韩在线观看免费全集电视剧网站| 国产精品爽爽ⅴa在线观看| 国产精品吊钟奶在线| 久久视频这里只有精品| 成人在线播放av| 亚洲欧美日本另类| 亚洲一区中文字幕在线观看| 国产精品欧美一区二区| 在线精品视频视频中文字幕| 亚洲精品wwwww| 性欧美xxxx交| 久久久久中文字幕| 97视频免费在线看| 亚洲亚裔videos黑人hd| 中文字幕少妇一区二区三区| 久久久久久久久国产精品| 国产一区二区久久精品| 国模吧一区二区三区| 欧美精品videos另类日本| 亚洲图片欧美日产| 欧美一乱一性一交一视频| 91av在线免费观看视频| 91精品视频免费观看| 成人福利视频在线观看| 久久99国产综合精品女同| 国产成人高潮免费观看精品| 色婷婷综合成人av| 日韩精品视频在线免费观看| 日韩免费观看高清| 欧美高清videos高潮hd| 一区二区三区在线播放欧美| 欧美夫妻性生活xx| 亚洲肉体裸体xxxx137| 91高清免费在线观看| 亚洲精品97久久| 亚洲аv电影天堂网| 亚洲国产高潮在线观看| 亚洲高清不卡av| 日韩资源在线观看| 91国内免费在线视频| 亚洲欧美日韩久久久久久| 91精品视频观看| 亚洲娇小xxxx欧美娇小| 国产精品日日摸夜夜添夜夜av| 国模极品一区二区三区| 亚洲精品资源美女情侣酒店| 欧美大码xxxx| 激情成人中文字幕| 精品香蕉一区二区三区| 亚洲一区二区久久久久久| 精品国内产的精品视频在线观看| 中文字幕亚洲欧美日韩2019| 欧美精品在线看| 日韩在线视频播放| 正在播放亚洲1区| 国产精品日韩欧美大师| 欧美日韩在线另类| 久久久久久成人精品| 日本中文字幕不卡免费| 国产精品夜间视频香蕉| 中文字幕av一区二区|