Попытка записать гиперопеки в схему

#algorithm #scheme #sicp

#алгоритм #схема #sicp

Вопрос:

Я пытаюсь написать программу гиперопеки в MIT / GNU-Scheme, однако у меня возникли некоторые проблемы, я написал отдельные до n = 5 рабочих, но хотел бы создать ту, которая выполняет все функции. Ниже я приведу некоторые из моих неудачных попыток.

 (define hyp (lambda (n x y)
  (hypiter n x x y)))
(define hypiter (lambda (lev an cou lim)
  (if (= lev 1) an
  (hypiter lev (hyp (- lev 1) an cou) cou lim))))
(define hyper (lambda (n x y)
  (hyper n x x y)))
(define hyperiter (lambda (lev an cou lim)
  (if (= lev 1) (  an cou)
  (hyper (- lev 1) an cou))))
(define h (lambda (n a b)
  (cond
    ((= n 1) (  a b))
    ((= b 1) (- n 1))
    (else (h (- n 1) (h (- n 1) a a) (- b 1)))))))
(define hyperoperation (lambda (n a b)
  (cond
    ((= n 0) (  1 b))
    ((and (= n 1) (= b 0)) a)
    ((and (= n 2) (= b 0)) 0)
    ((and (>= n 3) (= b 0)) 1)
    (else (hyperoperation (- b 1) a (hyperoperation n a (- b 1)))))))
  

Комментарии:

1. Пожалуйста, опубликуйте свою попытку заставить их работать. Итак, участники SO могли бы вам помочь.

2. Предоставленный мной код — это мои попытки заставить их работать.

Ответ №1:

Согласно определению в википедии, в последней строке вашего последнего определения есть ошибка. Это должно быть:

 (else (hyperoperation (- n 1) a (hyperoperation n a (- b 1))))))
  

вместо:

 (else (hyperoperation (- b 1) a (hyperoperation n a (- b 1)))))))
  

Таким образом, возможное правильное рекурсивное определение может быть:

 (define (hyperoperation n a b)
  (cond ((= n 0) (  b 1))
        ((= b 0) (cond ((= n 1) a)
                       ((= n 2) 0)
                       (else 1)))
        (else (hyperoperation (- n 1) a (hyperoperation n a (- b 1))))))
  

Комментарии:

1. Спасибо, это была одна из моих ошибок. Кроме того, ответы, которые я разработал на бумаге для проверки кода, были неверными. Спасибо.