當(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)??
最后show一下強(qiáng)大的scala,用一行代碼獲取斐波那契數(shù)列的前30位:?
Scala代碼??
總結(jié)
以上是生活随笔為你收集整理的fibonacci的几种实现及尾递归的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 递归 尾递归
- 下一篇: 求连续子数组的最大和