面试的时候碰到的问题:
农场里面买了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。
这样是不是比递归好理解一点呢?