Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Vlad__i__mir
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 371
1

Посчитать количество атомов в многоуровневом списке (в списке со вложенными списками)

22.10.2018, 18:42. Просмотров 1531. Ответов 10

Здравствуйте!

Нужно написать программу, которая бы вычисляла, сколько всего атомов в списке (списочной структуре), в том числе во вложенных списках.
Вот как я пытаюсь это сделать:

Lisp
1
2
3
4
(defun count (lists n) (cond ((null lists) n)
((atom 'car(lists)) (count (sdr(lists)) (+ n 1))
        (t (cons count((car lists) n) count((cdr lists) n))))
        ))
Логика такая (поправьте пожалуйста если она не верна): сперва мы рекурсивно спускаемся до пустого списка возвращая n=0, затем подымаясь по рекурсии вверх мы проверяем является ли голова атомом, если да то идем в хвост увеличивая счетчик, если нет, то что бы проникнуть во вложенный список рекурсивно вызываем данную функцию объединяя голову и хвост.

Не работает. Объясните пожалуйста почему?
Использовать можно только примитивы cdr, car, cons.

Добавлено через 13 минут
Объединение в последней ветке будет всё-таки наверное лишним

Lisp
1
2
3
4
(defun count (lists n) (cond ((null lists) n)
                            ((atom car(lists)) (count (sdr(lists)) (+ n 1)))
                            (t (count((car lists) n) count((cdr lists) n)))
                            ))
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2018, 18:42
Ответы с готовыми решениями:

Рекурсия. Количество числовых атомов в составном списке.
Доброго времени суток. Помогите, кто чем может :) Требуется написать рекурсивную функцию,...

Получить из списка произвольных атомов список атомов, которые в исходном списке встречаются один раз
Построить список атомов, которые встречаются в заданном списке ровно один раз.

Поиск элемента в многоуровневом списке
Помогите пожалуйста.Необходимо решить задачку - написать функцию предикатного типа....

Выстроить атомы в многоуровневом списке в один уровень по возрастанию
Написать функцию in-one-level(x), которая выстраивает атомы в многоуровневом списке x в один...

Удаление в многоуровневом списке всех подсписков, содержащих одно и то же число
Доброго времени суток. Очень нужна Ваша помощь. Задание : удалить в многоуровневом списке все...

10
vlisp
540 / 514 / 116
Регистрация: 10.08.2015
Сообщений: 1,913
Завершенные тесты: 1
22.10.2018, 19:17 2
в рай поспешишь, людей насмешишь
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
'car(lists)) (count (sdr
0
Vlad__i__mir
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 371
22.10.2018, 19:41  [ТС] 3
Цитата Сообщение от vlisp Посмотреть сообщение
в рай поспешишь, людей насмешишь
Если я вас правильно понял, мне не хватало скобок и апострофа. Добавил, но не работает:

Lisp
1
2
3
4
(defun count (lists n) (cond ((null lists) n)
                            ((atom car(lists)) (count (sdr(lists)) (+ n 1)))
                            (t (count ('(car(lists)) n) count('(cdr(lists)) n)))
                            ))
Добавлено через 8 минут
Цитата Сообщение от vlisp Посмотреть сообщение
в рай поспешишь, людей насмешишь
Нет, всё-таки вот так наверное будет вернее

Lisp
1
2
3
4
(defun count (lists n) (cond ((null lists) n)
                            ((atom car(lists)) (count (sdr lists) (+ n 1)))
                            (t (count (car lists) n) count(cdr lists) n)
                            ))
0
_sg
4114 / 3862 / 292
Регистрация: 12.05.2012
Сообщений: 2,720
22.10.2018, 19:49 4
варианты:
Lisp
1
2
3
4
5
6
7
(defun count-atom (w)
  (cond ((null w) 0)
        ((atom (car w)) (1+ (count-atom (cdr w))))
        (t (+ (count-atom (car w)) (count-atom (cdr w))))))
 
> (count-atom '(1 (2 ((3)) ((4) 5)6) 7))
7
Добавлено через 3 минуты
Lisp
1
2
3
4
5
6
7
(defun count-atom (w)
  (cond ((null w) 0)
        ((atom (car w)) (+ 1 (count-atom (cdr w))))
        (t (+ (count-atom (car w)) (count-atom (cdr w))))))
 
> (count-atom '(1 (2 ((3)) ((4) 5)6) 7))
7
Добавлено через 2 минуты
Lisp
1
2
3
4
5
6
7
(defun count-atom (w)
  (if w (+ (if (atom (car w)) 1 (count-atom (car w)))
           (count-atom (cdr w)))
      0))
 
> (count-atom '(1 (2 ((3)) ((4) 5)6) 7))
7
1
22.10.2018, 19:49
Vlad__i__mir
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 371
22.10.2018, 19:49  [ТС] 5
Цитата Сообщение от _sg Посмотреть сообщение
варианты:
А можно мой вариант доработать? Мне он больше понятен потому что там есть переменная-счётчик

Lisp
1
2
3
4
(defun count (lists n) (cond ((null lists) n)
                            ((atom (car lists)) (count (cdr lists) (+ n 1)))
                            (t (count (car lists) n) count (cdr lists) n)
                            ))
0
_sg
4114 / 3862 / 292
Регистрация: 12.05.2012
Сообщений: 2,720
22.10.2018, 20:07 6
Лучший ответ Сообщение было отмечено Vlad__i__mir как решение

Решение

Lisp
1
2
3
4
5
6
7
(defun count-atom (w &aux (a (car w)))
  (if w (+ (if (atom a) 1 (count-atom a))
           (count-atom (cdr w)))
      0))
 
> (count-atom '(1 (2 ((3)) ((4) 5)6) 7))
7
Добавлено через 10 минут
Lisp
1
2
3
4
5
6
7
(defun count-atom (w &optional (n 0 )&aux (a (car w)))
  (cond ((null w) n)
        ((atom a) (count-atom (cdr w) (1+ n)))
        (t (count-atom a (count-atom  (cdr w) n)))))
 
> (count-atom '(1 (2 ((3)) ((4) 5)6) 7))
7
Добавлено через 2 минуты
или:
Lisp
1
2
3
4
5
6
7
8
9
(defun count-atom (w) (cnt w 0))
 
(defun cnt (w n)
  (cond ((null w) n)
        ((atom (car w)) (cnt (cdr w) (+ n 1)))
        (t (cnt (car w) (cnt (cdr w) n)))))
 
> (count-atom '(1 (2 ((3)) ((4) 5)6) 7))
7
Добавлено через 1 минуту
Lisp
1
2
3
4
5
6
7
(defun count-atom (w n)
  (cond ((null w) n)
        ((atom (car w)) (count-atom (cdr w) (+ n 1)))
        (t (count-atom (car w) (count-atom (cdr w) n)))))
 
> (count-atom '(1 (2 ((3)) ((4) 5)6) 7) 0)
7
Добавлено через 1 минуту
или:
Lisp
1
2
3
4
5
6
7
(defun count-atom (n w)
  (cond ((null w) n)
        ((atom (car w)) (count-atom (+ n 1) (cdr w)))
        (t (count-atom (count-atom n (cdr w)) (car w)))))
 
> (count-atom 0 '(1 (2 ((3)) ((4) 5)6) 7))
7
2
Catstail
Модератор
24552 / 12468 / 2275
Регистрация: 12.02.2012
Сообщений: 20,240
22.10.2018, 20:10 7
Lisp
1
2
3
4
5
6
7
8
(defun atom-counter (lst)
  (apply '+ (mapcar (lambda (x) (if (atom x) 1 (atom-counter x))) lst)))
 
==> ATOM-COUNTER
 
(atom-counter '(1 (2 ((3)) ((4) 5)6) 7))
 
==> 7
1
Vlad__i__mir
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 371
22.10.2018, 20:13  [ТС] 8
Цитата Сообщение от _sg Посмотреть сообщение
или:
Я конечно дико извиняюсь, но скажите пожалуйста почему вот такой вариант при одно-уровненном списке работает верно, а при вложенных не верно?
Lisp
1
2
3
(defun count (lists n) (cond ((null lists) n)
                            ((atom (car lists)) (count (cdr lists) (+ n 1)))
                            (t (count (car lists) n) (count (cdr lists) n))))
Вот этот ваш вариант близок к моему
Lisp
1
2
3
4
5
6
(defun count-atom (w) (cnt w 0))
 
(defun cnt (w n)
  (cond ((null w) n)
        ((atom (car w)) (cnt (cdr w) (+ n 1)))
        (t (cnt (car w) (cnt (cdr w) n)))))
Но тут идут вложенные функции, такого ещё не изучал
0
_sg
4114 / 3862 / 292
Регистрация: 12.05.2012
Сообщений: 2,720
22.10.2018, 20:22 9
Лучший ответ Сообщение было отмечено Vlad__i__mir как решение

Решение

Ваш вариант:
Lisp
1
2
3
4
5
6
7
(defun count-atom (lists n)
  (cond ((null lists) n)
        ((atom (car lists)) (count-atom (cdr lists) (+ n 1)))
        (t (count-atom (car lists) (count-atom (cdr lists) n)))))
 
> (count-atom '(1 (2 ((3)) ((4) 5)6) 7) 0)
7
2
Vlad__i__mir
3 / 3 / 0
Регистрация: 04.01.2017
Сообщений: 371
22.10.2018, 20:29  [ТС] 10
Цитата Сообщение от _sg Посмотреть сообщение
Ваш вариант:
Спасибо, я понял
0
_sg
4114 / 3862 / 292
Регистрация: 12.05.2012
Сообщений: 2,720
23.10.2018, 01:00 11
Lisp
1
2
3
4
5
6
7
(defun count-atom (w)
  (cond ((null w) 0)
        ((atom w) 1)
        (t (+ (count-atom (car w)) (count-atom (cdr w))))))
 
> (count-atom '(1 (2 ((3)) ((4) 5)6) 7))
7
1
23.10.2018, 01:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2018, 01:00

Подсчет атомов во всем списке
Добрый вечер, помогите пожалуйста решить задачу, кому не будет в тягость.

Нахождение количества атомов в списке
ДОБРЫЙ ДЕНЬ. Попробовал написать программу, но не работает. Помогите пожалуйста найти и исправить...

Выделение атомов на заданном уровне в списке
Написать программу выделения атомов на заданном уровне в произвольном введёном исходном списке....


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

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

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