2012-10-31 6 views
3

시퀀스를 제곱 수의 시작 부분에서 만든 다음 이전 결과에 추가하는 방법은 무엇입니까?특정 번호에서 시퀀스를 만드는 방법은 무엇입니까?

7 => 49, 56, 63, ... 

def make_sequence(number) 
    lambda { number*number ??? } 
end 

num = make_sequence(7) 
num.call #=> 49 
num.call #=> 56 
... 
+0

체크 아웃 열거 : HTTP : //www.ruby- doc.org/core-1.9.3/Enumerator.html – levinalex

답변

2

초기 아이디어를 사용하여 폐쇄 후 내가 쓸 것 :

def make_sequence(n) 
    x = n**2 - n 
    lambda { x += n } 
end 

num = make_sequence(7) 
p num.call #=> 49 
p num.call #=> 56 
+0

그게 내가 뭘 찾고 있었는지, 고마워. – megas

2

사용 Enumerator

def make_sequence(start) 
    pos = start**2 
    Enumerator.new do |y| 
    loop do 
     y.yield(pos) 
     pos += start 
    end 
    end 
end 

seq = make_sequence(7) 
seq.next #=> 49 
seq.next #=> 56 

... 
2

Fiber 버전 :

def make_sequence(num) 
    inc = num 
    num = num*num 
    Fiber.new do 
    loop do 
     Fiber.yield(num) 
     num += inc 
    end 
    end 
end 

a = make_sequence(7) 
p a.resume #=> 49 
p a.resume #=> 56 
p a.resume #=> 63 
... 
+0

나는'num'을 그대로두고 (호출자와 잘 어울릴 것), 내부의 지역 변수를 업데이트 할 것입니다. – tokland

+0

루비에서는 재 할당이 원래 변수 내용을 변경하지 않습니다. 이 코드는 안전합니다. – levinalex

+0

죄송합니다.'num = num * num' 행을 보지 못했습니다. 이제 문제는 다른 것입니다 : 왜 새로운 변수를 만드는 대신 리바 인딩합니까? 수학적 관점에서'num = num * num'은 정말 나빠 보인다. – tokland

관련 문제