代码如下
PHP版本:
<?php
function getRabbit($day)
{
/**
* 初始数组: 用于统计每个年龄的兔子有几只
* 1. 键表示 年龄(几天大)
* 2. 值表示 该年龄的兔子的数量
*/
$arr = [
1 => 1,
2 => 0,
3 => 0,
4 => 0,
5 => 0,
6 => 0,
7 => 0,
8 => 0,
9 => 0,
10 => 0
];
//从第2天开始触发循环
for ($i = 0; $i < $day - 1; $i++) {
//先保存昨天记录
$yesterday = $arr;
/**
* 遍历而生成今天兔子年龄的统计情况:
* 1. 今天1天大的兔子数量, 是昨天4-9天大的兔子的数量的总和, 因为它们今天都到了生育年龄, 各生了1只兔子
* 2. 好比: 昨天2天大的兔子, 就是今天3天大的兔子
*/
foreach ($arr as $k => $v) {
$arr[$k] = $k == 1 ? $yesterday[4] + $yesterday[5] + $yesterday[6] + $yesterday[7] + $yesterday[8] + $yesterday[9] : $yesterday[$k - 1];
}
}
//返回兔子总数
return array_sum($arr);
}
echo getRabbit(100);//第100天有3040556004272只兔子
JS版本:
<script>
function getRabbit(day) {
/**
* 初始对象: 用于统计每个年龄的兔子有几只
* 1. 键表示 年龄(几天大)
* 2. 值表示 该年龄的兔子的数量
*/
let obj = {
1: 1,
2: 0,
3: 0,
4: 0,
5: 0,
6: 0,
7: 0,
8: 0,
9: 0,
10: 0
};
//从第2天开始触发循环
for (let i = 0; i < day - 1; i++) {
//先保存昨天记录: 先压缩再解压, 是为了yesterday和obj不成为1个对象
let yesterday = JSON.parse(JSON.stringify(obj));
/**
* 遍历而生成今天兔子年龄的统计情况:
* 1. 今天1天大的兔子数量, 是昨天4-9天大的兔子的数量的总和, 因为它们今天都到了生育年龄, 各生了1只兔子
* 2. 好比: 昨天2天大的兔子, 就是今天3天大的兔子
*/
for (let k in obj) {
obj[k] = k == 1 ? yesterday[4] + yesterday[5] + yesterday[6] + yesterday[7] + yesterday[8] + yesterday[9] : yesterday[k - 1];
}
}
//返回兔子总数
let sum = 0
for (let k in obj) {
sum += obj[k]
}
return sum
}
console.log(getRabbit(100)); //第100天有3040556004272只兔子
</script>