JS算法题 生小羊

面试的时候碰到的问题:

农场里面买了1只小羊,这只小羊第二年和第四年都会生一只小羊,第五年会死掉。生下来的小羊会继续生小羊,问若干年都农场共有多少羊?

这道题的解题思路有两个。
先说第一个,使用递归,想想阶乘是怎么实现的?

function sheepNum(year){
    var num = 1;
    for(var i=1; i<=year; i++){
        if(i==2){
            num += sheepNum(year - 2);
        }else if(i==4){
            num += sheepNum(year - 4);
        }else if(i==5){
            num--;
        }
    }
    return num;
}

sheepNum(10)

说说我的解题思路,把复杂度降低。

//这是农场
var farm = [];

//构造一只羊,羊有3个方法,成长,生育,死亡
function Sheep() {
  this.age = 0;
}

Sheep.prototype.grow = function(index,years){
  for(var i=1; i<=years; i++){
    //每年都会长1岁
    this.age++;

    //小羊2岁4岁都会生一只新的小羊    
    if(this.age == 2 || this.age == 4){
      //注意这里的参数
      this.bear(new Sheep(),years-i)
    }

    if(this.age == 5){
      //5岁死亡
      this.die(index);
      break;
    }
  }
}

Sheep.prototype.bear = function(childSheep,years){
  //生羊的时候把新生的羊也放进农场。
  var childIndex = farm.push(childSheep) - 1;

  //小羊继续长大,参数childIndex:羊在农场中的编号,years:此羊离N年还能长几年
  childSheep.grow(childIndex,years)
}

Sheep.prototype.die = function(index){
  //小羊死后移出农场
  farm.splice(index,1);
}

这样调用就可以了

var sheep = new Sheep();
//羊在羊圈中的位置
var index = farm.push(sheep) - 1;
//N年以后的情况
var years = 40;
//从第一只羊自己成长就不用管它了。
sheep.grow(index,years);

//统计农场里面一共几只羊。
console.log('total:'+farm.length)

当然你也可以把农场设成number,生小羊number+1,小羊死number-1。
这样是不是比递归好理解一点呢?