牛年求牛
问题描述
有一母牛,到4岁可生育,每年1头,所生均是一样的母牛,到15岁绝育,不能再生,20岁死亡,问n年后有多少头牛?
方法1:按照时间推移计算,嵌套循环
/**
 * 方法1:按照时间推移计算,嵌套循环
 * 用一个数组做中间联系,每出生一头牛往数组里添加一个元素,以当前的年份为值,最后统计数组元素,得出总数
 * @param int $year
 * @return int
 */
function getHowManyCowsForArray($year) {
    if ($year < 4) {
        return 1;
    }
    /**
     * 循环第一层,4岁可以生育,往后每年生一头。起始便存在一头牛,第4年时便生了一头牛0岁。
     * $list[序号] = 牛的生日;
     */
    $list[] = 0;
    for ($i = 4; $i <= $year; $i++) {
        /**
         * 循环第二层,取出上次新增的一头年,判断新增牛里面年龄是否有符合 [4岁, 15岁)。
         * $i 为第一层当前年份,$list[$j] 为上次新增牛的生日年份,相减即为上次新增牛的年龄。
         * 判断是否符合 [4岁, 15岁),符合再增加一头牛;如果到20岁便删除此牛。
         */
        $count = count($list);
        for ($j = 0; $j < $count; $j++) {
            $age = $i - $list[$j];
            if ($age >= 4 && $age < 15) {
                array_push($list, $i);
            } elseif ($age == 20) {
                unset($list[$j]);
            }
        }
    }
    return count($list);
}
方法2:不断的计算每头牛的产出,使用递归
/**
 * 方法2:不断的计算每头牛的产出,使用递归
 * @param int $year
 * @return int
 */
function getHowManyCowsForRecursion($year) {
    static $counter = 1;
    for ($i = 1; $i <= $year; $i++) {
        // 年龄符合 [4岁, 15岁),便新增一头牛。
        if ($i >= 4 && $i < 15) {
            $counter++;
            // 剩余的年数递归调用,直到最后一年。
            getHowManyCowsForRecursion($year - $i);
        }
        // 到20岁时,便减少一头牛。
        if ($i == 20) {
            $counter--;
        }
    }
    return $counter;
}