关于递归的一点点小偷学

来源:互联网 发布:狙击手幽灵战士2优化 编辑:程序博客网 时间:2024/06/06 01:34

迭代为人 递归为神

虽然代码看着美 但是我暂时觉得递归只适合去解决特殊的问题 比如树状


以下为转载内容  转自 大神 ''快乐的程序媛''    侵删


Question1—Fibonacci数列第N项

ana1=1a2=1an+2=an+1+ann1

  1. var fib = function (n){  
  2.   if(n<=2){  
  3.     return 1;  
  4.   }  
  5.   return fib(n-1) + fib(n-2);    
  6. }  
  7. console.log(fib(5));  

上面是递归实现。


[javascript] view plain copy
  1. var fib = function (n){  
  2.   var a1=1,a2=1,a3=0;  
  3.   if(n<=2){  
  4.     return 1;  
  5.   }  
  6.   for(var i = 0;i < n-1;i++){  
  7.     a3 = a1 + a2;  
  8.     a1 = a2;  
  9.     a2 = a3;  
  10.   }  
  11.   return a3;    
  12. }  
  13. console.log(fib(5));  

上面是循环实现。

Question2—一共10级楼梯,每次可以走一步或两步,求一共多少种走法。

思路:

要想走到N(N=10)级,可以分为2种情况。

  1. 从n-2级迈两步
  2. 从n-1级迈一步

那么对于n-2和n-1的情况也是各自分为两种,以此类推。

那么走法的和就是n-2的走法和n-1的走法之和。

那么递归到最基本的(当前人在第0阶台阶)

第0阶台阶:0

第1阶台阶:1

第2阶台阶:2(1+1或者2)

得到公式,也就是斐波那契数列。

f(n)=f(n1)+f(n2)


[javascript] view plain copy
  1. var fib = function (n){  
  2.   if(n == 1){  
  3.     return 1;  
  4.   }else if(n==2){  
  5.     return 2;  
  6.   }else if(n>2){  
  7.     return fib(n-1) + fib(n-2);  
  8.   }  
  9. }  
  10. console.log(fib(10));  

(看到这里真的忍不住叫了一声厉害,美到没朋友)


Question3—1个细胞,一个小时分裂一次,生命周期是3小时,求n小时后容器内,有多少细胞。


思路:

细胞的生存周期是3个小时,那我们就可以把细胞在题目中状态分为以下几个状态:

  • a:刚分裂态——由前一小时的a,b,c分裂出
  • b:分裂1小时态——由前一小时a长成
  • c:分裂2小时态——前一小时b长成
  • d:分裂3小时态——死亡的细胞。前一小时c长成,和之前的d一起组成。

那么,我们就可以根据细胞状态设定函数。分析每一个状态的来源是哪里即可。

a(t)=a(t1)+b(t1)+c(t1)b(t)=a(t1)c(t)=b(t1)d(t)=d(t1)+c(t1)

容器中存活的细胞数目就是a、b、c三种状态数量的总和。

[javascript] view plain copy
  1. var afib = function (n){  
  2.   if(n===0){return 1;} //初始的那个细胞  
  3.   return afib(n-1)+bfib(n-1)+cfib(n-1);  
  4. }  
  5. var bfib = function(n){  
  6.   if(n===0){return 0;} //一个小时之后才会生成  
  7.   return afib(n-1);  
  8. }  
  9. var cfib = function(n){  
  10.   if(n===0||n===1){return 0;} //前两小时还没生成  
  11.   return bfib(n-1);  
  12. }  
  13.   
  14. var time = 3;  
  15. console.log(afib(time)+bfib(time)+cfib(time));  
ps: 曾经看到一句描述递归的话 个人感觉算是在白话中比较好理解的
叫"包子馅的包子"叫递归极限了 就是"馒头" 但是我觉得这个馒头谁也啃不动,类似死循环;
而且内存会溢出? 最近没有对内存进行学习 先存疑 只是看到了网上的各位大神在写递归的时候多多少少都会提出内存的问题;