Линейный поиск в Лиспе, ошибки массива - PullRequest
1 голос
/ 07 мая 2019

Простой линейный поиск входного параметра, нельзя использовать встроенные функции, такие как поиск и т. Д.

К сожалению, я не могу найти много соответствующей документации, так как она либо устарела, и большинство не решает проблему так просто.

Советы по пониманию lisp очень ценятся.

(defun search(numray x) 
    (defvar i 0)
    (loop for i in numray
        (cond
        ((= x (aref numray i) "Element is present in array")
        ((/= x (aref numray i) "Element is not present in array")
        (t "iddunno")))))
 ) 

(setf numray (make-array '(10)   
:initial-contents '(0 11 2 33 44 55 66 7 88 99)))
(defvar x (read))
(search arr x)

Проверить определенный массив для входной переменной. Укажите, существует он или нет.

1 Ответ

8 голосов
/ 07 мая 2019
(defun search(numray x) 
    (defvar i 0)
    (loop for i in numray
        (cond
        ((= x (aref numray i) "Element is present in array")
        ((/= x (aref numray i) "Element is not present in array")
        (t "iddunno")))))
 ) 

(setf numray (make-array '(10)   
:initial-contents '(0 11 2 33 44 55 66 7 88 99)))
(defvar x (read))
(search arr x)

Первое, что вам нужно узнать о Лиспе, это сделать отступ для вашего кода в соответствии со структурой списка:

(defun search (numray x) 
  (defvar i 0)
  (loop for i in numray
        (cond
         ((= x (aref numray i) "Element is present in array")
          ((/= x (aref numray i) "Element is not present in array")
           (t "iddunno")))))
  ) 

(setf numray (make-array '(10)   
                         :initial-contents '(0 11 2 33 44 55 66 7 88 99)))
(defvar x (read))
(search arr x)

Далее:

  • DEFVAR для глобальных переменных, а не локальных
  • вам не нужно объявлять i, так как LOOP объявляет это
  • вам нужно написать DO до того, как итерация сформируется в LOOP
  • круглые скобки вокруг вызова = неверны
  • круглые скобки вокруг вызова /= неверны
  • вектор можно легко записать как # (1 2 3 4 5)
  • положить * вокруг глобальной переменной
  • не называйте вашу функцию search, потому что эта функция уже встроена
  • IN работает для списков, используйте ACROSS для векторов

Пример:

CL-USER 3 > (defun note-num-in-array (vector number) 
              (loop for item across vector do
                    (print (if (= number item)
                               "Element is present in array"
                               "Element is not present in array"))))
NOTE-NUM-IN-ARRAY

CL-USER 4 > (note-num-in-array #(1 2 3 1 2 4 5 4 3 2) 2)

"Element is not present in array" 
"Element is present in array" 
"Element is not present in array" 
"Element is not present in array" 
"Element is present in array" 
"Element is not present in array" 
"Element is not present in array" 
"Element is not present in array" 
"Element is not present in array" 
"Element is present in array" 
NIL
...