2014-02-21 4 views
2

스몰 토크를 사용하여 번째 피보나치 수를 반환해야합니다. 이전에이 언어를 사용하지 않았습니다. 이 프로그램은 모든 입력에 1을 반환하며 이유를 알지 못합니다. 내가 생각하기에 for 루프를 반복하지도 않았다. 누군가 나를 도울 수 있습니까? 감사.스몰 토크 피보나치

'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. 스몰 토크는 절차 언어가 아니기 때문에 한 가지 방법으로 긴 스크립트를 작성하면 안됩니다.
  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에 대해 엄격하게 왼쪽에서 오른쪽 규칙을 적용하는 반면 다른 언어에서는 수신자 위치에 b의 (원래) 값을 배치하기 전에 가장 오른쪽 할당을 정신적으로 평가하려고합니다.

i 변수를 사용하고 있지 않으므로 2 to: n do: 표현식을 어떻게 바꿨는지 확인하십시오.

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 ]. 

Pharo. VisualWorks위한

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