Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
某天我去腾讯面试,他给我出了一道算法题,我当时还没写出来,题目好像是说假设一对初生羊要一个月才到成熟期,而一对成熟羊每月会生一对羊,那么,由一对初生羊开始,12个月后会有多少对羊呢?
二、思路分析:
题目描述的是一个的场景,那么我们需要把他转换为代码,根据描述我们需要计算得到12个月后有多少对羊。我们先列举前几个月羊的繁殖情况:
假设我们都是从1号开始统计,1.1开始,羊生长需要1个月,那么1月底是初生期的最后一天。2.1统计时羊是成熟期,小羊可能是2月的某一出生,假设2.1统计的时候小羊还没出生,等到3月的时候小羊已经出生了。
1.1 羊生长 1对
2.1 羊繁殖 1对
3.1 成熟期的羊 初生期的羊 2对
4.1 成熟期的羊 初生期的羊 成熟期的羊 3对
黑色表示成熟期的羊,白色表示初生期的羊,得到的数据结论是 [1, 1, 2, 3, 5, 8, 13],第一个数和第二个数为1,之后的每一个数为之前两个数之和。
var climbStairs = function (n) {
if (n == 1 || n == 2) {
return 1
}
else {
return climbStairs(n - 2) + climbStairs(n - 1)
}
}
因此,羊问题得以解决,答案为144对。以上数列,即“斐波那契数列”。
四、总结:
斐波那契数列的自身特性:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……
第一项和第二项是1,之后的每一项为之前两项的和。即:
a1=a2=1
an=an-1+an-2 (n为正整数)
符合这个规则的数列就是斐波那契数列。
此时我还联想到了爬楼梯算法,该算法并不属于斐波那契数列,第一项和第二项是1和2,之后的每一项为之前两项的和。算法逻辑和之前十分类似。
有n级楼梯,有2种爬法,1次1级,或1次2级,问,n级楼梯有多少种爬法?
var climbStairs = function (n) {
if (n == 1 || n == 2) {
return n
}
else {
return climbStairs(n - 2) + climbStairs(n - 1)
}
}