斐波那契数列——R实现(简单基础递归)

浏览: 5629

意大利数学家斐波那契(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
}
推荐 1
本文由 jalu 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册