2014-02-21 149 views
2

我得使用Smalltalk返回n th斐波那契數,我以前沒有用過這種語言。這個程序返回1到任何輸入,我不知道爲什麼。它甚至沒有迭代我認爲的for循環。有人能幫助我嗎?謝謝。Smalltalk斐波那契

'Which fibonacci number do you want? (n>2)' printNl. 
n := stdin nextLine asInteger. 

(n <= 2) 
    ifTrue: ['Type a larger number, F(1) and F(2) equals 1!' displayNl.] 
    ifFalse: [ 
     result:= 1. 
     parent := 1. 
     gparent := 1. 
     2 to: n do: [ :i | [ 
       result := (parent + gparent). 
       gparent := parent. 
       parent := result. 
       'come on, do something' displayNl. 
      ] 
     ]. 
     result displayNl. 
    ]. 

回答

4

的美女你有一組額外的括號內的循環體,這使得它創建(但不執行),在每個循環迭代塊。這裏是你的意思寫:

2 to: n do: [ :i | 
     result := (parent + gparent). 
     gparent := parent. 
     parent := result. 
     'come on, do something' displayNl. 
    ]. 
+0

非常感謝。 – appl3r

4

你爲什麼不中整數類中定義的方法

fib 
^self < 2 
    ifTrue: [ 1 ] 
    ifFalse: [ (self - 2) fib + (self - 1) fib ] 

,並用它來計算的順序?

  1. Smalltalk不是一種過程性語言,你不應該只用一種方法寫一個長腳本。
  2. 使用遞歸
+2

[不幸的是,遞歸的美容產生極其低效(指數時間)實施斐波那契數函數的](http://stackoverflow.com/questions/360748/computational-complexity -of-fibonacci-sequence),而正確的迭代解決方案則以線性時間運行。 –

+3

@robmayoff ** appl3r **詢問實施情況,而不是「優化實施」。你知道這個簡單的規則:1)讓它運行,2)使它正確,3)快速。我不會認爲這不是最佳的,但我認爲這對於作者理解對象和消息如何工作很重要。否則,我們都可以在RISC命令中編程 – Uko

+1

我不明白的是,爲什麼我的程序不能正常工作,而應該這麼做。 :/ 我有一個遞歸調用的版本,它工作正常,但我需要的是一個迭代實現。 – appl3r

3

你甚至可以,如果你想更簡單點:

a := b := 1. 
(n - 1) timesRepeat: [a := b + (b := a)]. 

半對稱的「棘輪」區塊中的表達是我所有的時間Smalltalk的最愛之一。不一定會贏得可讀性競賽,但我認爲這很酷。它將家庭嚴格遵循從Smalltalk的左至右的規則,而在其他語言中,我們希望在將b的(原始)值置於接收方位置之前,在心理上評估最右邊的分配。

還請注意我是如何替換您的2 to: n do:表達式的,因爲您沒有使用參數變量i

0
(1 to: n) 
inject: OrderedCollection new 
into: [ :coll :each | 
    | p pp n | 
    p := coll at: (each - 1) ifAbsent: [ 0 ]. 
    pp := coll at: (each - 2) ifAbsent: [ 0 ]. 
    n := p + pp. 
    ((n = 0) and: [ each = 1 ]) 
     ifTrue: [ n := 1 ]. 
    coll 
     add: n; 
     yourself ]. 

在法羅。

0
fib := [:n | 
     (n<=1) 
      ifTrue: [n] 
      ifFalse: 
       [ 
        (fib value: (n-1)) + 
        (fib value: (n-2)) 
       ] 
    ]. 
fib value 10 

爲VisualWorks中