我们已经完成了一项任务,我们无法弄清楚:
写一个R函数,它将生成一个包含第一个n的向量 Fibonacci序列的术语。其中的步骤如下: (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'类型的对象不是子集化的?
我们如何生成想要的功能?
答案 0 :(得分:6)
我在@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)
}