2017-01-06 3 views
0

Я нашел эту версию функции Аккермана и пытался кодировать его в MIT Scheme Lisp без успеха:объекта не применяется в MIT Scheme (функция а различный Аккерман)

The Ackermann Функция А (т, п)

При т = 0

а (т, п) = п + 1

При т> 0 и п = 0

а (т, п) = а (м-1 , 1)

При т> 0 и п> 0

А (т, п) = А (м-1, А (т, п-1))

(здесь http://www.gfredericks.com/sandbox/arith/ackermann)

Мой 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))))))) 

Теперь некоторые результаты:

(acker2 0 0) значение: 1

(acker2 0 1) значение: 2

(acker2 0 2) значение: 3

(acker2 2 2) объект 2 не является применимо

(acker2 1 23) объект 1 не применяется

(acker2 8 0) объект 7 не применяется

Какое решение?

ответ

2

Существует ошибка (слишком много скобок) в последнем выражении:

(acker2 (m (- n 1))) 

это должно быть:

(acker2 m (- n 1)) 

Помните, что в Lisp/Scheme (a b1 b2 ...) означает «применить функцию a к аргументы b1 b2 ... ". Сообщение «объект 2 не применимо» означает именно это: m равно 2, и система пытается применить его к (- n 1). Но число 2 («объект 2») не является функцией («неприменимо»).

Смежные вопросы