powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите решить задачу в Lispe
15 сообщений из 15, страница 1 из 1
Помогите решить задачу в Lispe
    #37595005
demaaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дан массив из 15 вещественных чисел.Если минимальный элемент массива находится на 2 месте, а максимальный - на 1 месте массива, то все элементы массива уменьшить в 2 раза.

Мы только проходили такие процедуры как: DEFUN,CAR,CDR,NULL,COND.
помогите в решение плиз, очень нужна задачка последний зачет остался((
заранее благодарен.
...
Рейтинг: 0 / 0
Помогите решить задачу в Lispe
    #37595237
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demaaa,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
(defun f (array)
  (cond ((and (first-is-max-p  array)
              (second-is-min-p array))
         (divide-by-2 array))
        ( t array )))

(defun first-is-max-p (array)
  (not (find #'(lambda (x) (> x (car array)))
             (cdr array))))

(defun second-is-min-p (array)
  (not (find #'(lambda (x) (< x (cadr array)))
             (cons (car array) (cddr array)))))

(defun divide-by-2 (array)
  (mapcar #'(lambda (x) (/ x 2)) array))

(defun find (predicate array)
  (cond ((null array)                    nil)
        ((funcall predicate (car array)) t)
        ( t    (find predicate (cdr array)))))
пример:
Код: plaintext
1.
2.
3.
4.
5.
CL-USER 1 > (f '(1.0 10.0 2.0 2.0))
(1.0 10.0 2.0 2.0)

CL-USER 2 > (f '(10.0 1.0 2.0 2.0))
(5.0 0.5 1.0 1.0)
...
Рейтинг: 0 / 0
Помогите решить задачу в Lispe
    #37595353
demaaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мы только проходили такие процедуры как: DEFUN,CAR,CDR,NULL,COND.((
препод с такими прцедурами не принимает
...
Рейтинг: 0 / 0
Помогите решить задачу в Lispe
    #37595381
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demaaa,

тогда я тебя расстрою, с таким набором поставленную задачу не решить, т.к. нужны еще как минимум функции сравнения чисел
...
Рейтинг: 0 / 0
Помогите решить задачу в Lispe
    #37595436
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k0rvinт.к. нужны еще как минимум функции сравнения чисел

и функция деления
...
Рейтинг: 0 / 0
Помогите решить задачу в Lispe
    #37597240
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k0rvink0rvinт.к. нужны еще как минимум функции сравнения чисел

и функция деления
А может быть препод прав и хочет реализации всего в базисе DEFUN,CAR,CDR,NULL,COND ?

Помню нас препод С++ заставлял реализовывать length(..) врукопашную.
...
Рейтинг: 0 / 0
Помогите решить задачу в Lispe
    #37597306
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

для этого нам нужен еще хотя бы CONS или QUOTE или LIST для реализации чисел и всего остального. ну и константа пустого списка NIL, но думаю она негласно входит в базис =)

впрочем, с QUOTE можно обойтись и без NIL (точнее NIL будет эквивалентен (QUOTE ()) )
...
Рейтинг: 0 / 0
Помогите решить задачу в Lispe
    #37597312
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k0rvin, флаг вам в руки. Наверное вы лучше лисп знаете.

Кст. хотел спросить QUOTE и LIST одинаковые? Или есть нюансы?
...
Рейтинг: 0 / 0
Помогите решить задачу в Lispe
    #37597413
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКст. хотел спросить QUOTE и LIST одинаковые? Или есть нюансы?

одинакового в них только буква t =)

LIST -- функция с произвольным количеством аргументов, возвращающая список из их значений
QUOTE -- особая форма (с одним аргументом), возвращающая выражение как оно есть, не вычисляя его.

Код: plaintext
1.
2.
3.
(defvar x 1)
(list x 2) ; => (1 2)
(quote (x 2)) ; => (x 2)
...
Рейтинг: 0 / 0
Помогите решить задачу в Lispe
    #37597428
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А следующие формы одинаковы?

Код: javascript
1.
(quote x 2)



Код: javascript
1.
'(x 2)
...
Рейтинг: 0 / 0
Помогите решить задачу в Lispe
    #37597459
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

нет, у quote может быть только один "аргумент"

запись
Код: plaintext
1.
'(x 2)
эквивалентна записи
Код: plaintext
1.
(quote (x 2))
" '_ " -- это лишь синтаксический сахар для " (quote _) ". в CL это просто макрос времени чтения, т.е. ' преобразуется в quote перед компиляцией при чтении исходного кода из строки/файла
...
Рейтинг: 0 / 0
Помогите решить задачу в Lispe
    #37597476
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоесть это макрос в самом настоящем Си-шном понимании? Тупая замена во время 1 трансляции исходника?
...
Рейтинг: 0 / 0
Помогите решить задачу в Lispe
    #37597638
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТоесть это макрос в самом настоящем Си-шном понимании? Тупая замена во время 1 трансляции исходника?

ага, называется - Read-Macros:

http://www.bookshelf.jp/texi/onlisp/onlisp_18.html
...
Рейтинг: 0 / 0
Помогите решить задачу в Lispe
    #37597643
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonk0rvinпропущено...


и функция деления
А может быть препод прав и хочет реализации всего в базисе DEFUN,CAR,CDR,NULL,COND ?

Помню нас препод С++ заставлял реализовывать length(..) врукопашную.

ага, числа черча заколбасить самостоятельно
...
Рейтинг: 0 / 0
Помогите решить задачу в Lispe
    #37597734
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТоесть это макрос в самом настоящем Си-шном понимании? Тупая замена во время 1 трансляции исходника?

не совсем, это обычная лисповая функция, выполняющаяся при чтении символа ' из потока и возвращающая s-выражение.

т.е. для обработки потока доступны все остальные лисповые функции, можешь даже тупо воспользоваться функцией read, прочитать s-выражение и обрабатывать уже его.

например
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
(defun read-dollar (stream char)
  (declare (ignore char))
  (let ((expr (read stream)))
    (if (listp expr)
        `(list ,@expr)
      (error "Expected list, given: ~s." expr))))

(set-macro-character #\$ #'read-dollar)
и теперь мы можем вместо " (list x 2) " писать " $(x 2) ":
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CL-USER 1 > (format t "~s" $123
Error: Expected list, given: 123.
  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 1 : 1 > :a

CL-USER 2 > (format t "~s" $(1 2 (+ 1 2)))
(1 2 3)
NIL

CL-USER 3 > 
в строке
Код: plaintext
1.
CL-USER 1 > (format t "~s" $123
REPL LispWorks'а при попытке завершить выражение закрытой скобкой "прочитал" то, что передано для $ и выдал ошибку, мол не список я написал для $

но вообще reader-макры очень редко пишут
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите решить задачу в Lispe
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]