Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 斐波那契函数_R_Fibonacci - Fatal编程技术网

R 斐波那契函数

R 斐波那契函数,r,fibonacci,R,Fibonacci,我们被赋予了一项任务,但我们无法理解: 编写一个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]} } 我们最终得到的只是一个错误:“closur

我们被赋予了一项任务,但我们无法理解:

编写一个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]}
 }
我们最终得到的只是一个错误:“closure”类型的对象是不可子集的


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

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

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

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)
}

1.为向量指定与函数不同的名称。2.创建向量时,请将其设置为正确的类型和大小:
fib=numeric(n)
。初始化
第二个问题的提示:谷歌。只要5秒钟,它就给了我几个不同的选择。如果你想惹恼你的老师,请使用封闭式表单;)(通常他们尝试用斐波那契例子教递归)+1来展示你的工作+如果你告诉你的老师你在StackOverflow上得到了帮助,那么无穷大。一般来说,你最好预先分配整个向量。这不仅节省了时间(因为每次通过循环进行扩展都需要大量操作),而且还节省了空间(因为向量在扩展时会在内部复制)。@CarlWitthoft你说得没错,我相信人们应该尽早学习最佳实践。我的观点是,有不同的方法可以工作,实际上,对于斐波那契序列,很少有人对生成足够大的序列感兴趣,这样节省的空间和时间将产生实际意义上的差异,但我将更新以强调最佳实践。
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)
}