Ir para o conteúdo

Função de Ackermann e Sequência de Mewman-Conway

; Exercicio 12.1 - Função de Ackermann
;
; Exercício resolvido por: Rui Maia <deathseeker25(at)portugal-a-programar(dot)org>
;
; Escreva em Scheme um procedimento para calcular a função de Ackermann, sabendo que 
; esta é definida para inteiros não negativos, recorrendo à recursividade.

(define Ackermann
  (lambda (m n)
    (cond ((= m 0)
           (+ 1 n))
          ((and (> m 0) (= n 0))
           (Ackermann (- m 1) 1))
          ((and (> m 0) (> n 0))
           (Ackermann (- m 1) (Ackermann m (- n 1)))))))

;Testes:
;
; > (Ackermann 3 4)
;125
;> (Ackermann 4 4)
; user break
;> (Ackermann 3 5)
;253
;> (Ackermann 3 6)
;509
;> (Ackermann 3 12)
; user break
;

; Exercício 12.2 - Sequência de Mewman-Conway
; Escreva em Scheme um procedimento para calcular o n-ésimo número na sequência Mewman-Conway.

(define Mewman-Conway
  (lambda (n)
    (cond ((or (= n 1) (= n 2))
           1)
          ((> n 2)
           (+ (Mewman-Conway (Mewman-Conway (- n 1))) (Mewman-Conway (- n (Mewman-Conway (- n 1)))))))))

;Testes:
;
;> (Mewman-Conway 1)
;1
;> (Mewman-Conway 2)
;1
;> (Mewman-Conway 3)
;2
;> (Mewman-Conway 4)
;2
;> (Mewman-Conway 5)
;3
;> (Mewman-Conway 10)
;6
;> (Mewman-Conway 20)
;12
;> (Mewman-Conway 40)
;user break