上周五晚上,在某群上看到下面这么道面试题目:
题目:
一个农夫,买了一头小牛,这头牛,成长到第四年开始,会每年生一头小牛,所生出来的小牛成长到第四年开始,也会每年生出一头小牛,请问 N 年之后,农夫共有多少头牛?
不考虑其他情况,比如死亡,逃跑等情况
思路
可以生育的牛称为大牛,未可生育的牛称为小牛
第 1 年:1头小牛
第 2 年:1头小牛
第 3 年:1头小牛
第 4 年:1头小牛,1头大牛 - 2头牛
第 5 年:2头小牛,1头大牛 - 3头牛
第 6 年:3头小牛,1头大牛 - 4头牛
第 7 年:4头小牛,2头大牛 - 6头牛
第 8 年:6头小牛,3头大牛 - 9头牛
...
实现
作为一个切图仔,我们使用javascript
来实现下~
// 一个农夫,买了一头小牛,这头牛,成长到第四年开始,会每年生一头小牛,所生出来的小牛成长到第四年开始,也会每年生出一头小牛,请问 N 年之后,农夫共有多少头牛?
// 不考虑其他情况
class Cow {
constructor() {
this.age = 1
}
addAge() {
this.age++
}
isCanBirth() {
return this.age >= 4;
}
}
function init(year) {
let arr = [new Cow()];
for(let i = 1; i <= year; i++) {
for(let j = 0; j < arr.length; j ++) {
let cow = arr[j];
if(cow.isCanBirth()) {
arr.push(new Cow())
} else {
cow.addAge()
}
}
console.log(`第${i}年,有${arr.length}个牛`)
}
}
init(10)
上面程序运行结果如下:
"第1年,有1个牛"
"第2年,有1个牛"
"第3年,有1个牛"
"第4年,有2个牛"
"第5年,有3个牛"
"第6年,有4个牛"
"第7年,有6个牛"
"第8年,有9个牛"
"第9年,有13个牛"
"第10年,有19个牛"
上面有啥不严谨的地方,希望您指出。相关的代码演示地址how_many_cow from codepen。
后话
文章首发 - 【面试】逻辑推理 - 农夫养牛问题
更多内容 - Jimmy Blog