Написание рекурсивного GCD на Лиспе - PullRequest
0 голосов
/ 12 апреля 2011

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

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

Наиболее распространенным является то, что он говорит "неопределенная функция а".Так что я решил, что мне нужно вернуть это место.Это не сработало.Я получаю много параметров для оператора if.Есть идеи, что я здесь делаю не так?Впервые в Lisp, и пока мы не встречаемся с глазу на глаз.

Запуск на CLISP в Windows 7.

Ответы [ 4 ]

6 голосов
/ 12 апреля 2011

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

(gcd b mod(a b))

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

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

(gcd b (mod a b))

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

2 голосов
/ 12 апреля 2011

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

1 голос
/ 12 апреля 2011

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

(defun gcd2(a b)
  (if (= b 0) a (gcd2 b (mod a b))))
0 голосов
/ 23 декабря 2011

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

Использование LispWorks:

(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 - функцией.

SBCL:

; 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
...