F. ackermana (2 arg. na 1 arg.)

Witam, chciałbym przerobić dwuargumentową funkcję Ackermana na metodę biorącą obiekt + jeden argument.

Funkcja dwuargumentowa działająca:

def ack(m, n) if m == 0 n + 1 elsif n == 0 ack(m-1, 1) else ack(m-1, ack(m, n-1)) end end
Przerobiona na obiekt + jeden argument:

[code] def ack(n)
m = self
m = m.to_int

    if m == 0 
        n+1
    elsif n == 0 
        m-1.ack(1)
    else 
       m-1.ack(m.ack(n-1))
    end

end

puts 2.ack(1)[/code]

I pytanie: dlaczego moja przeróbka nie działa?

[code=ruby]class Fixnum
def ack(n)
m = self
m = m.to_int

if m == 0 
    n+1
elsif n == 0 
    m-1.ack(1)
else 
   m-1.ack(m.ack(n-1))
end

end
end[/code]
jak ma działać na jakieś klasie to musisz ją otworzyć i w niej zdefiniować metodę
tak jak powyżej
z tym, że Twoja obecna implementacja generuje SystemStackError: stack level too deep :wink:

tak, wiem o tym fixnumie, tylko tak na szybko skopiowałem. Już znalazłem błąd i polegał on na tym, że używałem w rekurencji obiektów z operacjami arytmetycznymi. Poprawna wersja:

[code] def ack(n)

    m = self
    m = m.to_int
    l = m-1
    
    if m == 0
        n+1
    elsif n == 0    
        l.ack(1)
    else 
        l.ack(m.ack(n-1))
    end
    
end[/code]