我们得到了一项任务,我们无法弄清楚:
写一个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'类型的对象不是子集化的?
我们如何生成想要的功能?
我在@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)