斐波那契数列之兔子繁殖问题
据说很多枯燥的算法问题都是和生活密切相关的,毕竟很多算法都是人们有实际的需求才慢慢进入人们视野的,今天我们就以实际的一个生活中的问题来切入:"我们来聊聊兔子繁殖的问题"
一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?我们不妨拿新出生的一对小兔子分析一下:
第一个月小兔子没有繁殖能力,所以还是一对
两个月后,生下一对小兔对数共有两对
三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对。
这就是通常我们聊斐波那契数列时谈到的兔子问题,可能到现在为止很多没有接触过斐波那契数列概念的朋友依然不知道到底我想要谈什么?so,我们还是就上面谈到的兔子问题来继续深入一下,我们知道了三个月以后一共是三对兔子,那么依次类推我们可以得到下表:
兔子繁殖规律图.png那么我们可以从这个表中观察到什么呢?
幼仔对数=前月成兔对数
成兔对数=前月成兔对数+前月幼仔对数
总体对数=本月成兔对数+本月幼仔对数
斐波那契数列定义
对于斐波那契数列1、1、2、3、5、8、13、……。有如下定义
F(n)=F(n-1)+F(n-2)
F(1)=1
F(2)=1
不知道大家看完上面的定义后有什么直觉性的东西呢?反正我一看完我就想到了递归,递归就是自己调用自己嘛,好吧,话不多说,我们就先用递归来实现以下这个斐波那契数列吧:
斐波那契数列递归实现
#pragma mark - 斐波那契数列
#pragma mark -
/**
查找斐波那契数列中的第n个数
@param n 斐波那契数列中的第n个数
@return 斐波那契数列中的第n个数
*/
- (NSInteger)FibSequence:(NSInteger)n {
if (n < 2) {
return n == 0 ? 0 : 1;
}else {
return [self FibSequence:n - 1] + [self FibSequence:n -2];
}
}
看完后怎么样,是不是非常的简单?确实它看上去很清晰很简单。我只想说,看着很舒服,那么如果不用递归来实现的话呢?
斐波那契数列迭代实现
/**
查找斐波那契数列中的第n个数
@param n 斐波那契数列中的第n个数
@return 斐波那契数列中的第n个数
*/
- (NSInteger)FibSequence2:(NSInteger)n {
if (n < 2) {
return n == 0 ? 0 : 1;
}else {
NSInteger a = 0,b = 1,c = 0;
for (int i = 3; i < n - 1; i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
}
看上去是不是也不是很难,我还是来解释一下吧,毕竟每个人基础不一样,迭代实现的思路是这样的:使用三个变量来分别记录前两个数的值,前一个数的值,和当前数的值,分别对应a、b、c,
默认我初始化为了:0、1、0;因为当n为0的时候刚好a为0 ,n等于1时b = 1,而c默认为0,通过迭代不断让c = a + b也就是前两个数的和,这样就实现了,当然有什么不懂得可以留言给我,实在不懂的话打上断点一个一个数调试呗,肯定能搞懂了对吧。
网友评论