斐波那契函数

MiQ*_*MiQ 4 r fibonacci

我们得到了一项任务,我们无法弄清楚:

写一个R函数,它将生成一个包含Fibonacci序列的前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]}
 }
Run Code Online (Sandbox Code Playgroud)

我们最终得到的是错误:'closure'类型的对象不是子集化的?

我们如何生成想要的功能?

Sam*_*son 7

我在@bdecaf建议的封闭表格上投票(因为它会惹恼你的老师):

vast = function(n) round(((5 + sqrt(5)) / 10) * (( 1 + sqrt(5)) / 2) ** (1:n - 1))
Run Code Online (Sandbox Code Playgroud)

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

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)
 }
Run Code Online (Sandbox Code Playgroud)

我仍然会遵循已经给出的一些建议 - 特别是为你的向量和你的函数使用不同的名称,但事实是有很多不同的方法来实现你的目标.首先,在这个实例中根本没有必要初始化一个空向量,因为我们可以使用forR中的循环来扩展向量,就像你已经做的那样.您可以执行以下操作,例如:

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

当然,我们都有关于编程的东西,但这就是我们在这里的原因.在某些时候我们都得到了某人的帮助,我们都会变得更好,因为我们也帮助其他人改进.

更新:正如@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)
}
Run Code Online (Sandbox Code Playgroud)