同事提出一个问题,关于牛生小牛的算法,之前的牛生小牛的算法都是假设牛不死的情况下的,几年生一头,若干年后还有多少头,这个算法是有些变化的。

农场第一年有一头牛,假设这头牛每2年生一次小牛,小牛迅速长大,2年后又能生小牛,但是牛活到5岁的时候回自然的死去,那么求第N年还有多少牛。

我想,这个问题的难点在于,牛要死去。自然而然的,这里要进行设置一个条件,当牛的年龄达到5岁,让牛死去(就是让这个元素消失)。同事基于这种思路,写出了第一版本的代码

按照题意逻辑理解,进行顺序逻辑判断,编程代码如下

<?php
$fun=function($n){$list=[1];while ($n--) {foreach ($list as $k => $v) {if($v%2==0){$list[]=1;//生一头小牛
            }if($v==5){unset($list[$k]);//到五岁了 牛死了continue;}$list[$k]++;//牛长大了一岁
        }}return count($list);//返回牛的数目
};
echo $fun(10);
exit();

这个代码逻辑非常清晰,是基础中的典范,然而,我们发现当年数增加的时候,内存会溢出,比如在求100年以后的时候

然后他提出了改进方案使用array_pop回收

截图如下

代码如下:

<?php
$fun1 = function($n){$list = [1];while($n--){foreach($list as $k => $v){if($v%2 == 0){$list[] = 1;}if($v == 5){//unset($list[$k]);$list[$k] = array_pop($list);continue;}$list[$k]++;}}return count($list);
};echo $fun1(100);
exit();

然而这样还是会爆出内存泄漏 而且多了一个notice

针对牛的死去,以及再生,我通过牛的数量寻找规律想到了一个方案,不知道能不能被理解。

截图如下:

代码如下:

<?php
$sum=get_cow_num(10);
var_dump($sum);
exit();function get_cow_num($n)
{$sum=1;for ($i=1; $i < $n; $i++){$sum = $i%2!=0 ? $sum*2 : $sum-peibona($i/2-1);//奇数年要翻倍 偶数年减去斐波那契数
    }return $sum;
}
function peibona($n)
{if($n<=0){return 0;}if($n<=2){return 1;}return peibona($n-1)+peibona($n-2);
}

在计算100年以后的时候 30秒时间不足

我想办法延长时间

结果……

十分钟过去了,程序仍然没有停止的意思,真的是够够的了,看来递归不太适合,我猜测最后会因为递归,报错提示PHP不能递归超过99层,因为之前出过这样的问题。

那么我改进一下,采用曾经解决过的斐波那算法来解决这个问题。

这牛数量也太多了吧……

代码如下:

<?php
set_time_limit(0);
$sum=get_cow_num(100);
var_dump($sum);
exit();function get_cow_num($n)
{$sum=1;for ($i=1; $i < $n; $i++){$sum = $i%2!=0 ? $sum*2 : $sum-peibona($i/2-1);//奇数年要翻倍 偶数年减去斐波那契数
    }return $sum;
}
function peibona($n)
{if($n<=0){return 0;}if($n<=2){return 1;}$array=array_fill(0,$n,0);$array[0]=0;$array[1]=1;$array[2]=1;for ($i=3; $i <= $n; $i++){$array[$i]=$array[$i-1]+$array[$i-2];}return $array[$n];
}

这这段代码有没有优化的地方呢?当然有我们发现每次算斐波那切数都是要循环重置进行计算,为何不用静态缓存呢?

代码如下:

<?php
set_time_limit(0);
$sum=get_cow_num(100);
var_dump($sum);
exit();function get_cow_num($n)
{$sum=1;for ($i=1; $i < $n; $i++){$sum = $i%2!=0 ? $sum*2 : $sum-peibona($i/2-1,$n/2-1);//奇数年要翻倍 偶数年减去斐波那契数
    }return $sum;
}
function peibona($n,$total_num)
{static $array;if(!isset($array[$n])){if($n<=0){$array[$n]=0;}elseif($n<=2){$array[$n]=1;}else{$array=array_fill(0,$n,0);$array[0]=0;$array[1]=1;$array[2]=1;for ($i=3; $i <= $n; $i++){$array[$i]=$array[$i-1]+$array[$i-2];}}}return $array[$n];
}

这代码,哈哈哈哈,风骚的让人无法理解啊!

后来根据同事总结规律得出公式,采用偶数翻倍,奇数减去斐波那切数的公式,得到python代码

这代码极其风骚,采用递归完成,不过我估计不用递归应该更快才对。

关于斐波那切数的通项公式可以参考百度百科 https://baike.baidu.com/item/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97/99145?fr=aladdin

转载于:https://www.cnblogs.com/lizhaoyao/p/8716512.html

母牛2年生小牛 5年后并死去的算法相关推荐

  1. 一个农场有头母牛,现在母牛才一岁,要到四岁才能生小牛,四岁之后,每年生一头小牛,n年后有多少头小牛

    1 题目描述 一个农场有头母牛,现在母牛才一岁,要到四岁才能生小牛,四岁之后,每年生一头小牛. 假设每次生的都是母牛,并且也遵守4年才生育并生母牛的原则.且所生的牛都不会死 问20年之后共有多少头牛 ...

  2. 母牛问题。母牛每年生一只母牛,新出生的母牛成长三年后也能每年生一只 母牛……

    package class_08; /*** * 母牛每年生一只母牛,新出生的母牛成长三年后也能每年生一只* 母牛,假设不会死.求N年后,母牛的数量.* fn=f(n-1)+f(n-3)* * 如果每 ...

  3. java一只母牛 一年生头小牛_面向对象思想 解决农场母牛生小牛问题

    问题: 农场一头小母牛, 母牛每年生母牛. 母牛5岁产母牛, 20年后多少牛? PS:前提:第一头母牛已经>=5岁 思路脉络: 面向对象基本思想,注意状态和行为,抽象出对应的属性和方法 1.Ob ...

  4. java一只母牛 一年生头小牛_Java实现:工厂有一头母牛,一年生一头小母牛,小母牛五年后可以生小牛,问20年工厂有多少头牛?...

    共回答了16个问题采纳率:93.8% 文件Mooooo.java如下: import java.util.ArrayList; public class Mooooo { public static ...

  5. 算法练习day15——190403(简介、求n!、汉诺塔、打印字符串的子序列、打印字符串的全排列、母牛生小牛、最小路径和、累加和是否达到给定值)

    1. 简介 动态规划是为了优化暴力尝试的. 2. 求n! 2.1 一般思路 public static long getFactorial2(int n) {long result = 1L;for ...

  6. c语言母牛生小牛程序框图,C语言母牛问题

    一个农场有头母牛,现在母牛才一岁,要到四岁才能生小牛,四岁之后,每年生一头小牛.假设每次生的都是母牛,并且也遵守4年才能生育并生母牛的原则,并且无死亡,请问N年后共有过少头牛? 看到这个题目的时候 猛 ...

  7. 递推算法3——顺推法之母牛生小牛问题

    有一头母牛,每年年初生一头小母牛,每头小母牛从第3个年头起每年年初也可以生一头小母牛.求在第20年时有多少头母牛. 令x0_i,x1_i,x2_i,x3_i分别表示第i年后刚生下的母牛.满1岁的母牛. ...

  8. 数据结构与算法之母牛生牛

    数据结构与算法之母牛生牛 目录 字符凭拼接最低字典序 二维数组最小路径和 1. 字符凭拼接最低字典序 题目概述:母牛每年生一只小牛,新出生的母牛成长三年后也能每年生出一只母牛,假设不会死.求N年后,母 ...

  9. 编程练习:母牛的故事* 题解

    有一头母牛,它每年年初生一头小母牛.每头小母牛从第四个年头开始,每年年初也生一头小母牛.请编程实现在第n年的时候,共有多少头母牛? 输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0& ...

最新文章

  1. C语言读写配置文件--转载
  2. java监视器_监视和管理备份系统
  3. P4 详解各硬件部分
  4. 5分钟了解Zigbee的前世今生
  5. OFDM仿真程序,可直接运行,注释详细(没人注释比我还详细了)
  6. 怎样更换UC浏览器的字体?更换UC浏览器的字体的方法
  7. 百度,淘宝,腾讯三大巨头HTML页面规范分解
  8. 最全使用SQL Server创建、配置数据库的各种方法和注意细节
  9. 英文教材《FPGA-Prototyping-By-Verilog-Examples》下载
  10. 消息中间件解决方案-JMS-ActiveMQ
  11. SetWindowsHookEx 其他进程的 记录
  12. 【游戏】基于matlab GUI可调电扇设计【含Matlab源码 1110期】
  13. Java使用poi导出Excel之格式设置
  14. C语言学习之用函数求立方体的体积
  15. Excel数据透视表经典教程十三《打印数据透视表/图》
  16. 渗透测试中利用社会工程学的巧妙之处
  17. 中国电信SIM卡绝杀冷、热钱包,区块链手机还没火就要凉凉?
  18. 大数据开发学习:进行大数据开发课程有哪些
  19. 幼儿体能五项技能测试软件,卓艺湖畔幼儿园教师五项体能培训--器械游戏分享...
  20. Pandas二次学习- 回炉重造(进阶)

热门文章

  1. kubeadm工作原理-kubeadm init原理分析-kubeadm join原理分析
  2. C#:实现麦克劳林级数计算非线性函数算法(附完整源码)
  3. LVS负载均衡——NAT模式
  4. 2021-04-19
  5. python 抢票_Python3.x:抢票
  6. Arduino Pulsesensor脉搏心率的检测
  7. NLP工具——doccano标注系统自动标注功能使用
  8. python全局代理_Python3 中代理使用方法总结
  9. 2012年科技行业那些事:IT巨头加紧冲刺步伐
  10. python-20180103-1