R 斐波那契函数
我们被赋予了一项任务,但我们无法理解: 编写一个R函数,该函数将生成一个包含前n个 斐波那契序列的项。这方面的步骤如下: (a) 创建用于存储结果的向量。 (b) 初始化前两个元素。 (c) 运行一个循环,i从3运行到n,填充第i个元素 迄今为止的工作: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
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)
}