龙空技术网

奇安信2020春招笔试编程题-兔子繁衍

一攻城狮 117

前言:

眼前朋友们对“c语言 兔子繁衍问题”大概比较珍视,我们都需要剖析一些“c语言 兔子繁衍问题”的相关知识。那么小编同时在网上网罗了一些对于“c语言 兔子繁衍问题””的相关资讯,希望姐妹们能喜欢,大家一起来了解一下吧!

非常有幸地参与到了奇安信的笔试,这里谈一谈其中的一道题目,兔子繁衍,题目如下:

有一对兔子,从出生后第五个月起每个月都生一对兔子,小兔子长到第五个月后每个月又生一对兔子,假如兔子都不死,问第n个月的兔子对数为多少。

在说这道题之前,肯定要提那道经典的古典问题:

有一对兔子,从出生后第三个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第n个月的兔子对数为多少。

很多同学肯定都做过这道非常经典的题目,这是一道非常经典的斐波拉契的应用题。

这是用递归的解法:

def fab(n):

if n == 1 or n == 2:

return 1

return fab(n-1) + fab(n-2)

r = int(input("请输入月份:"))

print("第%d个月的兔子对数为%d" % (r, fab(r)))

本题将三月换成了五月,很多人就懵了,莫慌,接下来我们仔细分析一下。

首先我们可以先将月份和兔子对数列出一个对照表,如下:

月份: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 。。。

兔子对数:1 1 1 1 2 3 4 5 7 10 14 19 26 36 50 69 。。。

这样看很难发现有什么规律。我们回头再看一下那道古典问题,斐波拉契数列,第二项之后每项的值为前两项的和,可用式子表达为f(n)=f(n-1)+f(n-1)。

那么这道题会不会也是类似的规律呢?

于是我将每个月兔子对数的增值也列了出来,如下:

月份: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 。。。

兔子对数:1 1 1 1 2 3 4 5 7 10 14 19 26 36 50 69 。。。

对数增值: 0 0 0 0 1 1 1 1 2 3 4 5 7 10 14 19 。。。

从增值之中我们看到了在兔子队列这一行中出现过的数字,并且每个数字都出现在了第n-4项,由此可以发现规律f(n)=f(n-1)+f(n-4)。

以下是解法:

def fab(n):

if n == 1 or n == 2 or n == 3 or n == 4:

return 1

return fab(n-1) + fab(n-4)

r = int(input("请输入月份:"))

print("第%d个月的兔子对数为%d" % (r, fab(r)))

如果有问题或更好的解法,欢迎提出,希望大家都能找到好工作。

标签: #c语言 兔子繁衍问题 #兔子生兔子的编程题递归