在Lisp中编写递归GCD

时间:2011-04-12 05:39:37

标签: function recursion parameters lisp

编译此函数时,我一直收到随机错误:

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

最常见的是它表示“未定义的功能a”。所以我想我需要在那个地方返回一个。这没用。我得到了if语句错误的许多参数。知道我在这里做错了什么吗? Lisp的新手,到目前为止,我们并没有一致看待。

在Windows 7上运行CLISP。

4 个答案:

答案 0 :(得分:6)

在Lisp中,函数调用总是*以'('开头,所以行

(gcd b mod(a b))

表示“使用参数gcdb调用函数mod,并使用参数a调用函数b的结果。”

我怀疑你真的想要这样的东西:

(gcd b (mod a b))

*我有一段时间没有使用过Lisp,所以在“always”上我可能不会100%正确。

答案 1 :(得分:2)

(gcd b mod(a b))应为(gcd b (mod a b))

答案 2 :(得分:1)

mod函数调用错误。这是我的工作代码:

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

答案 3 :(得分:0)

通常编译器可以为您提供更多信息:

使用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