日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

fibonacci的几种实现及尾递归

發(fā)布時(shí)間:2025/6/15 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 fibonacci的几种实现及尾递归 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Java代碼??
  • /**?
  • ?*?java?version?"1.6.0_17"<br>?
  • ?*?尾遞歸與迭代實(shí)現(xiàn)具有相當(dāng)?shù)男阅?<br>?
  • ?*?緩存實(shí)現(xiàn)的性能略高于非尾遞歸實(shí)現(xiàn);<br>?
  • ?*?遞歸:recursive??尾遞歸:tail?recursive;<br>?
  • ?*?尾遞歸時(shí)不需保存方法調(diào)用棧的參數(shù)及返回結(jié)果;于是申請(qǐng)的棧幀會(huì)被及時(shí)回收?
  • ?*/??
  • 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?非尾遞歸實(shí)現(xiàn)(書(shū)本上經(jīng)常出現(xiàn))????
  • public?static?long?fibo1(long?n){????
  • ????if(n<2)?return?n;????
  • ????return?fibo1(n-1)+fibo1(n-2);?//小心棧溢出????
  • }????
  • //1.2?緩存實(shí)現(xiàn)(JS?good?part里有過(guò)介紹)????
  • public?static?int?LENGTH=30;?//過(guò)大了就會(huì)占用過(guò)多空間????
  • 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);?//減少重復(fù)計(jì)算????????????????
  • ????}????
  • ????return?cache[n];????
  • }????
  • //1.3?迭代實(shí)現(xiàn)????
  • 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?尾遞歸實(shí)現(xiàn)????
  • public?static?long?fibo4(int?n){????
  • ????if(n<2)?return?n;????
  • ????return?fibo4Helper(n,?1,?1,?3);?//保持與非尾遞歸接口不變,是借助幫助方法實(shí)現(xiàn)尾遞歸的????
  • }????
  • 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);????//這里相當(dāng)于迭代實(shí)現(xiàn)for-loop的濃縮??????
  • }???
  • ??????
  • ????//----------------------尾遞歸的其他實(shí)現(xiàn)-------------------------------------->??
  • ????//2.?求最大公約數(shù)??
  • ????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?翻轉(zhuǎn)字符串--非尾遞歸??
  • ???????public?static?String?reverse1(String?s,?int?length){??
  • ????????????if(length==0)?return?"";?//下一行的"+"可借助高版本JDK編譯器的優(yōu)化??
  • ????????????return?s.charAt(length-1)+reverse1(s,length-1);??
  • ????????}??
  • ???????//4.2?翻轉(zhuǎn)字符串--尾遞歸??
  • ???????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.?驗(yàn)證字符串是否是回文?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.?翻轉(zhuǎn)整數(shù)?如: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一下強(qiáng)大的scala,用一行代碼獲取斐波那契數(shù)列的前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)??
  • 總結(jié)

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

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。