减轻斐波那契while循环

时间:2019-06-24 21:36:45

标签: r fibonacci

这个问题让我头疼,我只是想不通。问题是编写R函数,该函数将返回等于或小于n的每个斐波那契数。

到目前为止,我已经尝试过进行while循环。

vast <- function(n) {
 if (n==1) return(1)
 x <- c(1,1)
 while (length(x)-1 < n) {
  pos <- length(x)
  new <- x[pos-1] + x[pos]
  x <- c(x,new)
  }
 x<-x[x <= n]
 return(x)
 }

除了我尝试退还作品外,它的工作原理就像魅力。到那时,R程序开始无限计算,并且课程包卡住了。

也可以这样写解决方案,使得人们可以假设n是斐波那契数。有什么办法可以减轻这个循环,例如用break或next语句还是更容易从不同角度解决问题?

1 个答案:

答案 0 :(得分:0)

该代码按原样提供正确的输出,但是对于大量代码来说非常慢。例如,在我的机器上,vast(100000)(结果中只有25个元素)要花10秒钟以上的时间运行,并且此后速度呈指数下降。

之所以变慢,是因为您的while条件正在测试是否包含n-1个元素的向量,而不是最后一个/最大向量为<= n的向量的裸露要求。对于vast(100000)而言,当答案最终仅需要前25个元素时,您将创建一个100,000个元素的向量。

此代码可在n = 10^5000之后立即工作,而原始功能在我机器上的100k中起作用。唯一的变化是,它现在正在检查向量中的最后一个数字是否大于n,而不是检查向量是否具有n元素。

vast2 <- function(n) {
 if (n==1) return(1)
 x <- c(1,1)
 # while (length(x)-1 < n) {  # OLD
 while (max(x) < n) {        # NEW
  pos <- length(x)
  new <- x[pos-1] + x[pos]
  x <- c(x,new)
  }
 x<-x[x <= n]
 return(x)
 }