【问题标题】:Lighten a fibonacci while loop减轻斐波那契 while 循环
【发布时间】:2019-06-24 21:36:45
【问题描述】:

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

【问题讨论】:

  • 欢迎来到 SO。我看不出你的功能有什么问题,也许你可以提供一个例子来说明你的问题。可以只用x 替换return(x)
  • 类似地,akilu,该功能就像我宣传的那样工作。请证明您在谈论什么行为;我建议显示您的代码(包括输入参数)和错误/警告/消息,或者您知道您的 R 实例行为不端。
  • 抱歉信息不清楚。问题是代码太慢了(正如 Jon Spring 在他的回答中所说),它阻塞了我们课程中使用的数据包。用max(x) 替换length(x)-1 使代码更快。

标签: r fibonacci


【解决方案1】:

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

它慢的原因是您的while 条件是测试向量是否具有n-1 元素,而不是最后/最大向量为&lt;= n 的向量的基本要求。对于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)
 }

【讨论】:

    猜你喜欢
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2022-12-06
    • 2015-04-30
    • 2016-01-02
    • 2020-01-26
    • 1970-01-01
    相关资源
    最近更新 更多