Написание рекурсивного НОД на Лиспе

Я продолжаю получать случайные ошибки при компиляции этой функции:

(defun gcd (a b)
  (if (= b 0)
      a
      (gcd b mod (a b))))

Наиболее распространенным является то, что он говорит «неопределенная функция а». Поэтому я решил, что мне нужно вернуться в это место. Это не сработало. Я получаю слишком много параметров для ошибки оператора if. Любая идея, что я делаю неправильно здесь? Новичок в Лиспе, и пока мы не сходимся во взглядах.

Работает на CLISP в Windows 7.


person yaegerbomb    schedule 12.04.2011    source источник


Ответы (4)


В Лиспе вызов функции всегда* начинается с '(', поэтому строка

(gcd b mod(a b))

означает "вызов функции gcd с аргументами b, mod и результатом вызова функции a с аргументом b".

Я подозреваю, что вы действительно хотите что-то вроде:

(gcd b (mod a b))

* Я не использовал Lisp какое-то время, поэтому я не могу быть на 100% прав на «всегда».

person Cameron Skinner    schedule 12.04.2011
comment
Вот и все. Я определенно использовал неправильный синтаксис для вызова метода мода. - person yaegerbomb; 12.04.2011

(gcd b mod(a b)) должно быть (gcd b (mod a b))

person Dan D.    schedule 12.04.2011

Ваш mod вызов функции неверен. Вот мой рабочий код:

(defun gcd2(a b)
  (if (= b 0) a (gcd2 b (mod a b))))
person Sander Marechal    schedule 12.04.2011

Обычно компилятор может дать вам больше информации:

Использование ЛиспВоркс:

(defun gcd1 (a b)
  (if (= b 0)
      a
      (gcd1 b mod (a b))))


CL-USER 31 > (compile 'gcd1)
;;;*** Warning in GCD1: GCD1 is called with the wrong number of arguments: Got 3 wanted 2
;;;*** Warning in GCD1: MOD assumed special

The following function is undefined:
A which is referenced by GCD1
GCD1

Итак, вы видите, что вы вызываете GCD1 с неправильным количеством аргументов, что MOD предполагается переменной, а A предполагается функцией.

СБКЛ:

; in: DEFUN GCD1
;     (GCD1 B MOD (A B))
; 
; caught WARNING:
;   The function was called with three arguments, but wants exactly two.

; in: DEFUN GCD1
;     (A B)
; 
; caught STYLE-WARNING:
;   undefined function: A

;     (GCD1 B MOD (A B))
; 
; caught WARNING:
;   undefined variable: MOD
person Rainer Joswig    schedule 23.12.2011