惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
GbyAI
GbyAI
Y
Y Combinator Blog
The GitHub Blog
The GitHub Blog
B
Blog
博客园 - 叶小钗
V
Visual Studio Blog
小众软件
小众软件
阮一峰的网络日志
阮一峰的网络日志
博客园 - 聂微东
S
SegmentFault 最新的问题
Engineering at Meta
Engineering at Meta
博客园 - Franky
V
V2EX
人人都是产品经理
人人都是产品经理
H
Hackread – Cybersecurity News, Data Breaches, AI and More
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
IT之家
IT之家
T
The Blog of Author Tim Ferriss
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
C
Check Point Blog
N
Netflix TechBlog - Medium
博客园 - 【当耐特】

博客园 - chinese_submarine

QT项目性能调优小记 Windows下HG服务器的搭建 svn+tp-link+花生壳搭建外网服务器 udev介绍 极大极小博弈树的简洁(附Tic-Tac-Toe源码) 程序优化小记 Beating the Average------为什么要学习Lisp[转] 巧用qmake工具生成专业的makefile QT中拖拽的实现(附示例代码) 从QDataStream向QByteArray中写入数据时的注意点(QT) 如何保持GUI的响应流畅(QT平台) 也谈线程同步变量 windows7到期的问题 简述FPS的计算方法 QT中的View Model模型系列一 TimeZoneChange事件的捕获 浏览器扩展系列————透明浏览器窗口的实现 浏览器扩展系列————异步可插入协议(pluggable protocol)的实现 浏览器扩展系列————给MSTHML添加内置脚本对象【包括自定义事件】
从农夫养牛问题推广到斐波那契数列
chinese_submarine · 2009-10-31 · via 博客园 - chinese_submarine

今天在CSDN上看到一条题目:

 一个农夫养了一头牛,三年后,这头牛每年会生出1头牛,生出来的牛三年后,又可以每年生出一头牛……问农夫10年后有多少头牛?n年呢?

这里主要谈一下解决这种问题的思想。首先可以联系斐波那契数列,设f(n)为第n年的牛,则

f(n) = f(n - 1) + f(n - 2)————>表达式1-1

即第n年的牛为去年牛的个数f(n - 1)加上今年出生牛的个数,那么今年有多少头牛能生呢?(不考虑死亡的牛)则为前年牛的个数即f(n - 2),因为前年的牛今年至少3岁,即为表达式1-1

推广一下,将牛生育年龄设为m,那么计算的表达式就变为

f(n) = f(n - 1) + f(n - m + 1)————>表达式1-2

n-1年牛的个数加上n-m+1年的牛生出的小牛。

那么下面讨论一个稍微复杂点的问题,如果增加一个条件,即牛会在第8年死去,那么第n年会有多少条牛呢?

为了便于推导,这里先设几个函数:

·         f(n)即第n年牛的个数

·         h(n)即第n年出生的牛的个数

·         g(n)即第n年死亡的牛的个数

那么这里可以首先想到一个表达式:

(1)f(n) = f(n -1) + h(n) - g(n)

即第n年牛的个数为第n-1年牛的个数+n年出生的牛的个数-n年死亡的牛的个数

而第二个表达式即关于新增牛的个数h(n)的:

(2)h(n) = f(n - 2) - g(n - 1)

即第n年出生的牛的个数为第n-2年牛的个数减去在第n-1年死亡的牛的个数

再看第三个表达式关于第n年死亡的牛的个数的:

(3)g(n)=h(n - 7)

即第n年死亡的牛的个数为第n - 7年出生的牛的个数,这是一个对称的关系。

推导的步骤如下,将(2)代入(1)

f(n) = f(n - 1) + f(n - 2)- g(n - 1) - g(n)---->4

再将(3)式代入(4)

f(n) = f(n - 1) + f(n - 2) - h(n - 8) - h(n - 7)----->(5)

再将(2)式代入(5)的h(n - 7)

f(n) = f(n - 1) + f(n - 2) - (h(n - 8) + f(n - 9) - g(n - 8))

到了这里不难看出(h(n - 8) + f(n - 9) - g(n - 8))即为f(n - 8)通过式(1)

则最终的表达式为

f(n) = f(n - 1) + f(n - 2) - f(n - 8)

即第n年牛的个数为第n-1年牛的个数+n-2年牛的个数-n-8年牛的个数

当牛的生育年龄用a表示,死亡年龄用b表示时,则表示为:

f(n) = f(n - 1) + f(n – a + 1) - f(n - b)

验证程序如下:

Code

Over,欢迎大家拍砖~ 

posted on 2009-10-31 17:30  chinese_submarine  阅读(1871)  评论()    收藏  举报