【问题标题】:Fibonacci function斐波那契函数
【发布时间】:2014-05-03 00:34:45
【问题描述】:

我们被分配了一项任务,但我们无法弄清楚:

编写一个 R 函数,它将生成一个包含第一个 n 的向量 斐波那契数列的术语。其中的步骤如下: (a) 创建向量来存储结果。 (b) 初始化前两个元素。 (c) 运行一个循环,i 从 3 到 n,填充第 i 个元素

到目前为止的工作:

vast=function(n){
 vast=vector()
 vast[1]=1
 vast[2]=1
 for(i in 3){vast[i]=vast[i-1]+vast[i-2]}
 }

我们最终得到的只是错误:“闭包”类型的对象不是可子集的??

我们应该如何生成想要的函数?

【问题讨论】:

  • 1.给你的向量一个与函数不同的名称。 2. 创建矢量时,使矢量的类型和大小正确:fib = numeric(n)
  • 初始化vast <- rep(NA, n)并正确循环for (i in 3:n)
  • 提示您的第二个问题:google。只需 5 秒,我就有了几个不同的选择。
  • 如果你想惹恼你的老师,请使用封闭式;)(通常他们会尝试用斐波那契例子来教授递归)
  • +1 用于展示您的作品。 +infinity 如果您向老师表明您在 StackOverflow 上获得了帮助。

标签: r fibonacci


【解决方案1】:

正如@bdecaf 建议的那样,我的投票是封闭式的(因为这会惹恼你的老师):

vast = function(n) round(((5 + sqrt(5)) / 10) * (( 1 + sqrt(5)) / 2) ** (1:n - 1))

但是您可以通过两个小改动来修复已有的代码:

vast=function(n){
 vast=vector()
 vast[1]=1
 vast[2]=1
 for(i in 3:n){vast[i]=vast[i-1]+vast[i-2]}
 return(vast)
 }

我仍然会遵循已经给出的一些建议——尤其是为你的向量和函数使用不同的名称,但事实是有很多不同的方法可以实现你的目标。一方面,在这种情况下根本不需要初始化一个空向量,因为我们可以使用 R 中的for 循环来扩展向量,就像你已经在做的那样。例如,您可以执行以下操作:

vast=function(n){
  x = c(1,1)
  for(i in 3:n) x[i] = x[i-1] + x[i-2]
  return(x)
}

当然,我们都有关于编程的知识,但这就是我们来这里的原因。我们都曾在某个时候得到过某人的帮助,并且在帮助他人进步的同时也会变得更好。

更新:正如@Carl Witthoft 指出的那样,最好在已知大小时将向量初始化为适当的大小,以节省时间和空间,因此另一种方法可以实现这一点任务是:

vast=function(n) {
  x = numeric(n)
  x[1:2] = c(1,1)
  for(i in 3:n) x[i] = x[i-1] + x[i-2]
  return(x)
}

【讨论】:

  • 一般来说,最好预先分配 整个 向量。这不仅节省了时间(因为每次通过循环进行扩展都是很多操作),而且节省了空间(因为向量在扩展时在内部被复制)。
  • @CarlWitthoft 你绝对是对的,我相信人们应该尽早学习最佳实践。我的观点是,有不同的工作方式,实际上,对于斐波那契数列,很少有人会对生成足够大的数列感兴趣,以节省空间和时间将产生实际意义的差异,但我会更新以突出最佳做法。
猜你喜欢
  • 2017-07-08
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2014-05-23
  • 1970-01-01
相关资源
最近更新 更多