意大利数学家斐波那契(Fibonacci, L.)在他的名著《算法之书》中提出的一个问题: 假定每对成年兔子每月能生产一对幼兔,而每对幼兔生长两个月就成为大兔,由一对幼兔开始,一年后可以繁殖成多少对兔子?(假定所有兔子都没有死亡)
这个问题衍生出了著名的数列:1,1,2,3,5,8,13,21,34,55,89,144,…这个数列被称为斐波那契数列,因为以兔子繁殖为例子而引入,故又称为“兔子数列”
斐波纳契数列数学上被以如下递归的方式定义:
F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
根据数列性质,下面使用R实现该数列:
实现方式一: 使用for循环的方式输出数列前N项
Fibonacci1 <- function(n){
x <- c(1,1)
for(i in 1:n){
x[i+2] = x[i+1] + x[i]
}
print(x[1:n]) #print(x[n])直接输出数列第n项
}
Fibonacci1(13) #输出数列前13项
实现方式二: 使用while循环的方式输出数列前N项
Fibonacci2 <- function(n){
x <- c(1,1);
i=1
while(i <= n){
x[i+2] = x[i+1] + x[i]
i<-i+1;
}
print(x[1:n]) #print(x[n])直接输出数列第n项
}
Fibonacci2(13) #输出数列前13项
使用while循环限制取到不超过某个值的前N项
x <- c(1,1)
i = 1
while(x[i+1] + x[i] <= 1000){
x[i+2] = x[i+1] + x[i]
i = i+1
}
print(x)#返回不超过1000的全部数列项
实现方式三: repeat控制循环,break函数是结束repeat的唯一方法
Fibonacci3 <- function(n){
x <- c(1,1)
i = 0
repeat{ i= i+1
x[i+2]= x[i+1]+x[i];
if(i>n)break}
print(x[1:n])
}
Fibonacci3(13) #输出数列前13项
使用repeat循环限制取到不超过某个值的前N项
x <- c(1,1)
a<-NULL
i = 0
repeat{x=c(x,a)
i= i+1
a= x[i]+x[i+1];
if(a > 1000)break} #返回不超过1000的全部数列项
实现方式四: 递归输出数列第N项
Fibonacci4 <- function(n){
ifelse(n>2,Fibonacci2(n-1)+Fibonacci2(n-2),1)
}
Fibonacci4(13) #输出数列第13项
Fibonacci4(1:13) #输出数列前13项
注:递归的方式简洁但是很浪费内存,处理大型问题是个难题,这里n取到50渣渣电脑就不能输出数据了
实现方式五: loop输出数列前N项
a=1
b=1
for(idx in 1:13) #输出数列前13项
{
print(a)
c=a+b
a=b
b=c
}