Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 16.10.2009
Сообщений: 29
1

Определить первый атом в списке, а если такого в списке нет, вывести nil

17.09.2011, 16:02. Просмотров 1417. Ответов 11
Метки нет (Все метки)

Помогите с написанием функции на lisp. 1. Функция которая определяет первый атом в списке, а если такого в списке нет, выводит нил. 2.нерекурсивная функция которая вычисляет сумму цифр в данном списке. Очень нужна оперативная помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2011, 16:02
Ответы с готовыми решениями:

Найти первый отличный от NIL атом в произвольном списке
Помогите найти первый отличный от NIL атом в произвольном списке (общей рекурсией) ((() A) B C) –>...

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

В списке есть вложенные списки,если все числа во вложенном списке положительные,то вывести сумму этих чисел
есть список ,в нём вложенные подсписки,если во вложенном подсписке все элементы положительные то...

Программа, возвращающую список вида: первый элемент — атом, появляющийся в списке один раз, второй - два раза и т.д
Помогите пожалуйста!! Есть список атомов. Написать программу, возвращающую список вида: первый...

11
Эксперт С++
5810 / 3461 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
18.09.2011, 04:43 2
Lisp
1
2
3
4
5
6
7
(defun head (list)
  (if list
      (car list)
      list))
 
(defun sum (list)
  (reduce #'+ list))
0
VH
424 / 253 / 22
Регистрация: 23.11.2010
Сообщений: 278
18.09.2011, 08:33 3
1.
Lisp
1
2
3
4
5
(defun F (L)
 (if L
  (if (atom (car L))
   (car L)
   (F (cdr L)))))
0
Модератор
26265 / 13675 / 2599
Регистрация: 12.02.2012
Сообщений: 22,427
19.01.2013, 22:31 4
Цитата Сообщение от iezuit Посмотреть сообщение
2.нерекурсивная функция которая вычисляет сумму цифр в данном списке. Очень нужна оперативная помощь.
оперативность, правда, невысока...
Lisp
1
2
3
4
5
6
7
8
(defun sum-list (lst &aux (s 0))
  (dolist (i lst s) (when (numberp i) (setq s (+ i s)))))
 
==> sum-list
 
(sum-list '(1 2 3 a b c 4 5 6))
 
==> 21
0
4324 / 4052 / 320
Регистрация: 12.05.2012
Сообщений: 2,861
20.01.2013, 00:44 5
Lisp
1
2
3
4
5
6
7
8
9
(defun lead-atom (w) 
  (cond ((null w) nil)
        ((atom (car w)) (car w)) 
        ((lead-atom (cdr w)))))
 
> (lead-atom '((a) ((b) c) d))
D
> (lead-atom '((a) ((b) c)))
NIL
Lisp
1
2
3
4
5
6
7
(defun lead-atom (w)
  (loop for a in w when (atom a) return a))
 
> (lead-atom '((a) ((b) c) d))
D
> (lead-atom '((a) ((b) c)))
NIL
Lisp
1
2
3
4
5
6
7
8
(defun lead-atom (w) (find-if #'atom w))
 
> (lead-atom '((a) ((b) c)))
NIL
> (lead-atom '((a) ((b) c) d))
D
> (lead-atom '((a) ((b) c) d e))
D
0
53 / 54 / 37
Регистрация: 06.02.2013
Сообщений: 255
Записей в блоге: 1
09.02.2013, 22:38 6
Цитата Сообщение от Catstail Посмотреть сообщение
оперативность, правда, невысока...
Lisp
1
2
3
4
5
6
7
8
(defun sum-list (lst &aux (s 0))
  (dolist (i lst s) (when (numberp i) (setq s (+ i s)))))
 
==> sum-list
 
(sum-list '(1 2 3 a b c 4 5 6))
 
==> 21
а на каком лиспе сделано? а то у меня в mulisp87 не выполняет данный код

Undefined Function Break: (DOLIST (I LST S) (WHEN (NUMBERP I) (SETQ S (+ I S))))
0
Модератор
26265 / 13675 / 2599
Регистрация: 12.02.2012
Сообщений: 22,427
10.02.2013, 10:46 7
Цитата Сообщение от Константин_2012 Посмотреть сообщение
а на каком лиспе сделано? а то у меня в mulisp87 не выполняет данный код
- это сделано в HomeLisp. Будет работать и в Common Lisp.
0
Модератор
26265 / 13675 / 2599
Регистрация: 12.02.2012
Сообщений: 22,427
10.02.2013, 12:23 8
Вот решение для muLisp-87:

Lisp
1
2
3
4
5
6
(defun sum-list (lst)
  (setq s 0)
  (loop
     ((null lst) s)
     (cond ((numberp (car lst))  (setq s (+ s (car lst)))))
     (setq lst (cdr lst))))
1
Миниатюры
Определить первый атом в списке, а если такого в списке нет, вывести nil  
4324 / 4052 / 320
Регистрация: 12.05.2012
Сообщений: 2,861
10.02.2013, 12:29 9
Lisp
1
2
3
4
5
6
(defun sumx (w)
  (cond ((null w) 0)
        ((numberp (car w)) (+ (car w) (sumx (cdr w))))
        ((sumx (cdr w)))))
 
> (sumx '(54 gh 5 fd 7 9 12 -2 f))
Lisp
1
2
3
4
5
(defun sumx (w)
  (loop for a in w when (numberp a) sum a))
 
> (sumx '(54 gh 5 fd 7 9 12 -2 f))
85
1
Модератор
26265 / 13675 / 2599
Регистрация: 12.02.2012
Сообщений: 22,427
10.02.2013, 12:41 10
_sg, Э... Тут проблема в muLisp! Попробуйте запустить Ваши решения в muLisp87. Чтобы получить то, что я привел выше, мне понадобился почти час

Добавлено через 5 минут
В muLisp форма (любая) может иметь вид: ((условие) ...тело...) И все бы хорошо, но когда условная форма выполняется внутри loop, то первое же не Nil - условие просто разрывает цикл! Поэтому легко написать суммирование числового списка:

Lisp
1
2
3
4
5
6
(defun sum-list (lst)
  (setq s 0)
  (loop
     ((null lst) s)
     (setq s (+ s (car lst)))
     (setq lst (cdr lst))))
Но как только пишешь так:

Lisp
1
2
3
4
5
6
(defun sum-list (lst)
  (setq s 0)
  (loop
     ((null lst) s)
     ((numberp (car lst)) (setq s (+ s (car lst))))
     (setq lst (cdr lst))))
то получаешь первое число списка (а не сумму!). Хоть тресни!
0
4324 / 4052 / 320
Регистрация: 12.05.2012
Сообщений: 2,861
10.02.2013, 12:54 11
чем можно объяснить использование mulisp, какими преимуществами, привычкой преподавателя?

Добавлено через 2 минуты
Константин_2012 согласился использовать другой Лисп
0
53 / 54 / 37
Регистрация: 06.02.2013
Сообщений: 255
Записей в блоге: 1
11.02.2013, 03:20 12
Цитата Сообщение от _sg Посмотреть сообщение
чем можно объяснить использование mulisp, какими преимуществами, привычкой преподавателя?
именно так)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2013, 03:20

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Написать программу, возвращающую список вида: первый элемент — атом исходного списка, появляющийся в списке один раз (с
Есть список атомов. Написать программу, возвращающую список вида: первый элемент — атом исходного...

Рекурсия: вернуть значение T, если в заданном списке L имеется более N-подсписков и NIL в противном случае
Всем привет! Снова прошу помощи у знатоков HomeLisp. Нужно разработать функцию, которая принимает...

В поиске добавить код если нет такого значения в стринггрид то вывести ошибку такого значения нет, если находит то вывод
procedure TForm1.Button5Click(Sender: TObject); var i,j,k:integer;S:string; begin for i:=1 to...

Найти наименьший четный элемент массива (если такого нет, то вывести первый элемент)
В одномерном массиве из 40 элементов найти наименьший четный элемент массива. Если такого нет, то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.