一對兔子,從出生後的第3個月起每月都生1對,小兔子長到第3個月後每月又生1對兔子,假如兔子都不死,某個月的兔子總數是多少
分析:每月兔子總數1,1,2,3,5,8,13,21,34,55...算法
n1=1;//第一個月
n2=1;//第二個月函數
n1=n1+n2;//第三個月spa
n2=n1+n2;//第四個月code
f(n):第n個月 兔子總量blog
f(n)=f(n-1)+f(n-2)遞歸
f(5)=f(4)+f(3)ip
f(4):3內存
f(3):2io
f(2):1console
f(1):1
<script> function calFib(){ var n1=1,n2=1; var str=''; for(var i=1;i<=10;i++){ str+=n1+","+n2+","; n1=n1+n2; n2=n1+n2; } console.log(str); } calFib(); /*遞歸:計算兔子總量*/ function f(n){ if(n==1|| n==2){ return 1; } return f(n-1)+f(n-2); } console.log(f(5));//第五個月的兔子總數 </script>
遞歸:在函數內,又調用了本身;遞歸調用的內層函數,是在外層函數還未結束時,就已經開始了,外層函數的調用,就會被阻塞;
遞歸缺點:算法複雜度過高,浪費內存
解決:大多數遞歸,能夠被循環替代的;
/*for循環替換遞歸*/ function f(n){ if(n==1|| n==2){ return 1; } var f1=1,f2=1; var fn; //條件:從1開始,到n-2結束 //操做:f1+f2賦值給一個變量(fn);將f2賦值給f1;將fn賦值給f2; for(var i=1;i<=n-2;i++){ fn=f1+f2; f1=f2; f2=fn; } return fn; } console.log(f(5));