日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

fibonacci的几种实现及尾递归

發布時間:2025/6/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 fibonacci的几种实现及尾递归 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Java代碼??
  • /**?
  • ?*?java?version?"1.6.0_17"<br>?
  • ?*?尾遞歸與迭代實現具有相當的性能;<br>?
  • ?*?緩存實現的性能略高于非尾遞歸實現;<br>?
  • ?*?遞歸:recursive??尾遞歸:tail?recursive;<br>?
  • ?*?尾遞歸時不需保存方法調用棧的參數及返回結果;于是申請的棧幀會被及時回收?
  • ?*/??
  • public?class?TestFibo?{??
  • ??
  • ????public?static?void?main(String[]?args)?{??
  • ????????int?N=50;??
  • ????????long?begin=System.currentTimeMillis();????????
  • ????????System.out.println(fibo1(N));?//fibo1??
  • ????????System.out.println(System.currentTimeMillis()-begin);??
  • ??????????
  • ????????begin=System.currentTimeMillis();??
  • ????????System.out.println(fibo2(N));?//fibo2??
  • ????????System.out.println(System.currentTimeMillis()-begin);??
  • ??????????
  • ????????begin=System.currentTimeMillis();??
  • ????????System.out.println(fibo3(N));?//fibo3??
  • ????????System.out.println(System.currentTimeMillis()-begin);??
  • ??????????
  • ????????begin=System.currentTimeMillis();??
  • ????????System.out.println(fibo4(N));?//fibo4??
  • ????????System.out.println(System.currentTimeMillis()-begin);??
  • ????}??
  • //1.1?非尾遞歸實現(書本上經常出現)????
  • public?static?long?fibo1(long?n){????
  • ????if(n<2)?return?n;????
  • ????return?fibo1(n-1)+fibo1(n-2);?//小心棧溢出????
  • }????
  • //1.2?緩存實現(JS?good?part里有過介紹)????
  • public?static?int?LENGTH=30;?//過大了就會占用過多空間????
  • public?static?long[]?cache=new?long[LENGTH];????
  • public?static?long?fibo2(int?n){????
  • ????if(n<2)?return?n;????
  • ????if(n>=LENGTH){????
  • ????????return?fibo2(n-1)+fibo2(n-2);????
  • ????}else?if(cache[n]==0){????
  • ????????cache[n]=fibo2(n-1)+fibo2(n-2);?//減少重復計算????????????????
  • ????}????
  • ????return?cache[n];????
  • }????
  • //1.3?迭代實現????
  • public?static?long?fibo3(long?n){????
  • ????if(n<2)?return?n;????
  • ????long?pre=1,prepre=1,ret=0;????
  • ????for(int?i=2;i<n;i++){????
  • ????????ret=pre+prepre;????
  • ????????prepre=pre;????
  • ????????pre=ret;????
  • ????}????
  • ????return?ret;????
  • }????
  • //1.4?尾遞歸實現????
  • public?static?long?fibo4(int?n){????
  • ????if(n<2)?return?n;????
  • ????return?fibo4Helper(n,?1,?1,?3);?//保持與非尾遞歸接口不變,是借助幫助方法實現尾遞歸的????
  • }????
  • private?static?long?fibo4Helper(int?n,long?prepre,long?pre,int?begin){????
  • ????if(n==begin)?return?pre+prepre;????
  • ????return?fibo4Helper(n,?pre,?prepre+pre,?++begin);????//這里相當于迭代實現for-loop的濃縮??????
  • }???
  • ??????
  • ????//----------------------尾遞歸的其他實現-------------------------------------->??
  • ????//2.?求最大公約數??
  • ????public?static?int?gcd(int?big,int?small){??
  • ????????if(big%small==0)?return?small;??
  • ????????return?gcd(small,?big%small);??
  • ????}??
  • ????//3.1?階乘--非尾遞歸??
  • ????public?static?int?fn1(int?n){??
  • ????????if(n<2)?return?1;??
  • ????????return?n*fn1(n-1);??
  • ????}??
  • ????//3.2?階乘--尾遞歸??
  • ????public?static?int?fn2(int?n){??
  • ????????if(n<2)?return?1;??
  • ????????return?fn2Helper(1,?n);??
  • ????}??
  • ????private?static?int?fn2Helper(int?ret,?int?n){??
  • ????????if(n<2)?return?ret;??
  • ????????return?fn2Helper(ret*n,n-1);??
  • ????}??
  • ????????//4.1?翻轉字符串--非尾遞歸??
  • ???????public?static?String?reverse1(String?s,?int?length){??
  • ????????????if(length==0)?return?"";?//下一行的"+"可借助高版本JDK編譯器的優化??
  • ????????????return?s.charAt(length-1)+reverse1(s,length-1);??
  • ????????}??
  • ???????//4.2?翻轉字符串--尾遞歸??
  • ???????public?static?String?reverse2(String?s){??
  • ???????????return?reverse2Helper(s,?"",?s.length());??
  • ???????}??
  • ???????private?static?String?reverse2Helper(String?s,String?init,int?len){??
  • ???????????if(len==0)?return?init;??
  • ???????????return?reverse2Helper(s,?init+s.charAt(len-1),?len-1);??
  • ???????}??
  • ????//5.?驗證字符串是否是回文?testHuiwen("abcdcba")??
  • ?????public?static?boolean?testHuiwen(String?s){??
  • ?????????return?testHuiwenHelper(s,?0,?s.length());??
  • ?????}??
  • ?????private?static?boolean?testHuiwenHelper(String?s,int?begin,?int?len){??
  • ?????????if(begin<?len>>1?&&?s.charAt(begin)==s.charAt(len-begin-1))???
  • ?????????????return?testHuiwenHelper(s,?begin+1,?len);??
  • ?????????else?if(begin==len>>1)?return?true;??
  • ?????????else?return?false;??
  • ?????}??
  • ????//6.?翻轉整數?如:1024=>4201??
  • ?????public?static?int?reverseInt(int?i){??
  • ?????????return?reverseIntHelper(i,?0);??
  • ?????}??
  • ?????private?static?int?reverseIntHelper(int?i,?int?init){??
  • ?????????if(i==0)?return?init;??
  • ?????????return?reverseIntHelper(i/10,?init*10+i%10);??
  • ?????}??
  • }??

  • 最后show一下強大的scala,用一行代碼獲取斐波那契數列的前30位:?
    Scala代碼??
  • >(1?to?28).foldLeft("0,1")((a,b)=>a+","+a.split(",").takeRight(2).map(_.toInt).reduceLeft(_+_))????
  • ??
  • >0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229????
  • ??
  • >(1?to?28).foldLeft(List(1,0))((a,b)=>(a.head+a.tail.head)::a).reverse.mkString(",")????
  • ??
  • >0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229??
  • ??
  • ??
  • scala>?def?fibo(n:Int)=(1?to?n).foldLeft(List(0,1))((a,b)=>a:+(a.init.last+a.last))??
  • fibo:?(n:?Int)List[Int]??
  • ??
  • scala>?fibo(10)??
  • res4:?List[Int]?=?List(0,?1,?1,?2,?3,?5,?8,?13,?21,?34,?55,?89)??
  • 總結

    以上是生活随笔為你收集整理的fibonacci的几种实现及尾递归的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。