2014-03-25 145 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你絕對是對的,我相信人們應該儘早學習最佳實踐。我的觀點是,有很多不同的方法可行,對於斐波那契數列來說,很少有人會對產生足夠大的序列感興趣,以節省空間和時間會產生實際上有意義的差異,但我會更新以突出最佳做法。 –