2017-01-06 6 views
0

Je trouve cette version de la fonction d'Ackermann et a essayé de le coder dans le schéma MIT Lisp sans succès:objet ne est pas applicable au MIT Scheme (un autre de Fonction Ackermann)

La Ackermann Fonction A (m, n)

Lorsque m = 0

A (m, n) = n + 1

Lorsque m> 0 et n = 0

A (m, n) = A (m-1 , 1)

Lorsque m> 0 et n> 0

A (m, n) = A (m-1, A (m, n-1))

(trouvé ici http://www.gfredericks.com/sandbox/arith/ackermann)

Mon code Scheme:

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

maintenant des résultats:

(acker2 0 0) valeur: 1

(acker2 0 1) valeur: 2

(acker2 0 2) La valeur : 3

(acker2 2 2) objet 2 est pas applicable

(1 acker2 23) objet 1 ne soit pas applicable

(acker2 8 0) objet 7 est non applicable

Quelle est la solution?

Répondre

2

Il y a une erreur (trop de parenthèses) dans la dernière expression:

(acker2 (m (- n 1))) 

cela devrait être:

(acker2 m (- n 1)) 

Rappelez-vous que dans Lisp/Scheme (a b1 b2 ...) signifie « appliquer la fonction a à les arguments b1 b2 ... ". Le message "l'objet 2 n'est pas applicable" signifie exactement ceci: m est égal à 2 et le système tente de l'appliquer à (- n 1). Mais le numéro 2 ("l'objet 2") n'est pas une fonction ("n'est pas applicable").