2014-03-25 111 views
4

我们得到了一个任务,我们只是想不通:斐波那契功能

写的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]} 
} 

所有我们最终是与错误:类型的对象'关闭'不是子集?

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

+1

1.给你的向量一个不同于函数的名字。 2.创建它时,使您的矢量的类型和大小正确:'fib = numeric(n)'。 – Roland

+1

初始化'浩大< - rep(NA,n)'并正确循环'(我在3:n)'。 –

+0

提示您的第二个问题:google。仅仅5秒,它给了我几种不同的选择。 – Mikko

回答

5

我的投票是在封闭的形式@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) 
} 

当然,我们每个人都有的东西,以了解编程,但是这就是为什么我们在这里。我们都在某个时候从某个人那里得到了帮助,当我们帮助别人改善时,我们都会变得更好。

UPDATE:作为@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

一般来说,你最好预先分配*整个*向量。这样不仅可以节省时间(每当循环进行大量操作时都会扩展),而且可以节省空间(因为矢量在扩展时会在内部复制)。 –

+1

@CarlWitthoft你绝对是对的,我相信人们应该尽早学习最佳实践。我的观点是,有很多不同的方法可行,对于斐波那契数列来说,很少有人会对产生足够大的序列感兴趣,以节省空间和时间会产生实际上有意义的差异,但我会更新以突出最佳做法。 –