减轻斐波那契 while 循环

Lighten a fibonacci while loop

这个问题让我很头疼,想不通。问题是编写 R 函数,它将 return 每个斐波那契数等于或小于 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)
 }

除了当我尝试 return 作品时,它就像魅力一样。那时 R 程序开始无限计算,课程包卡住了。

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

代码按原样提供了正确的输出,但是对于大数字来说它非常慢。例如,在我的机器上,vast(100000)(结果中只有 25 个元素)需要 10 多秒才能达到 运行,然后以指数方式减慢。

速度慢的原因是您的 while 条件正在测试向量是否具有 n-1 个元素,而不是最后一个/最大向量为 [=14= 的向量的基本要求].对于 vast(100000) 的情况,您正在创建一个包含 100,000 个元素的向量,而答案最终只需要前 25 个元素。

此代码在 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)
 }