Ошибка вызова функции Lisp - PullRequest
4 голосов
/ 19 ноября 2010

Я написал функцию на Лиспе так:

(defun power (base exponent)
  (if (= exponent 0)
      1
    (* base (power (- exponent 1)))))

Однако, когда я пытаюсь вызвать ее, я получаю некоторые ошибки:

CL-USER 2 > (power 2 3)

Error: POWER got 1 arg, wanted at least 2.
  1 (abort) Return to level 0.
  2 Return to top loop level 0.

Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.

CL-USER 3 : 1 > (power 2)

Error: POWER got 1 arg, wanted at least 2.
  1 (abort) Return to level 1.
  2 Return to debug level 1.
  3 Return to level 0.
  4 Return to top loop level 0.

Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.

CL-USER 4 : 2 > (power 2 3 4)

Error: POWER got 3 args, wanted 2.
  1 (continue) Ignore the extra arg.
  2 (abort) Return to level 2.
  3 Return to debug level 2.
  4 Return to level 1.
  5 Return to debug level 1.
  6 Return to level 0.
  7 Return to top loop level 0.

Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.

Что здесь происходит?Если я даю ему два аргумента, он думает, что я дал ему один.Если я дам три, он думает, что дал три.Если я даю один, он думает, что я дал один ...

Ответы [ 4 ]

11 голосов
/ 19 ноября 2010

Это рекурсивный вызов, который имеет только один аргумент:

(power (- exponent 1))

Это должно быть так:

(power base (- exponent 1))
6 голосов
/ 19 ноября 2010

Рекурсивный вызов - ваша проблема.Вы забыли передать базу как первый аргумент.

(* base (power (- exponent 1)))))

должно быть:

(* base (power base (- exponent 1)))))

3 голосов
/ 19 ноября 2010

Скомпилируйте ваши функции. В LispWorks используйте c-sh-c для компиляции определения в редакторе.

Здесь, в REPL:

CL-USER 18 > (defun power (base exponent)
               (if (= exponent 0)
                   1
                 (* base (power (- exponent 1)))))
POWER

CL-USER 19 > (compile 'power)
;;;*** Warning in POWER: POWER is called with the
;;;    wrong number of arguments: Got 1 wanted 2

Компилятор уже скажет вам, что есть проблема с кодом.

Обратите внимание, что слушатель LispWorks (REPL) не компилируется. Вы должны скомпилировать определения, которые вы вводите в Слушателе, с помощью функции COMPILE. В качестве альтернативы вы можете ввести определения в окно редактора и откомпилировать его оттуда (путем компиляции файла, буфера или выражения) LispWorks также имеет функции для поиска кода, где происходит ошибка.

1 голос
/ 19 ноября 2010

Lisp поставляется с функцией expt, поэтому не нужно определять свою собственную.

(Если это не упражнение или домашнее задание, в этом случае вы можете захотеть взглянуть на более эффективные методы, такие как возведение в квадрат при помощи квадрата .)

...