这个问题让我头疼,我只是想不通。问题是编写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语句还是更容易从不同角度解决问题?
答案 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)
}