Сколько в дереве атомов

Количество атомов в дереве

(COUNT-ATOMS ‘(A (B) C)) должен вернуть пять.

A, B и C и два NIL в дереве.

Напишите функцию COUNT-ATOMS, которая возвращает количество атомов в дереве.

(defun count-atoms(l) (cond ((null l) 0) (t (+ (cond ((atom (car l)) 1) (t 0)) (count-atoms (cdr l)))))) 

Однако (COUNT-ATOMS ‘(A (B) C)) вернет 2.

Как мне сделать, чтобы вернуть 5 вместо?

Не могли бы вы объяснить поподробнее?

2 ответа

Если вы хотите собрать (a (b) c) во время выполнения, используя только cons и quote , вы должны написать:

(cons 'a (cons (cons 'b nil) (cons 'c nil))) 

В строящемся дереве 5 атомов (a, b, c и два ноля). На практике вы можете использовать более простую запись, например (list ‘a (list ‘b) ‘c) .

В своей функции вы не вписываетесь в АВТОМОБИЛИ ваших деревьев, только в CDRS. Кроме того, когда CAR не является атомом, как, например, когда вы сталкиваетесь с (B) , вы добавляете ноль (предложение по умолчанию во втором cond ) (правка. Как заметил kmkaplan, вы также считаете ноль для ноль, первый cond) .

Вот простое решение, основанное на typecase :

(defun count-atoms (form) (typecase form (atom 1) (cons (+ (count-atoms (car form)) (count-atoms (cdr form)))))) 
  • Когда вы сталкиваетесь с атомом, результат равен 1.
  • Когда у вас есть консул, вы суммируете количество атомов в ее машине и CDR.

typecase отправляется в соответствии с типом своего аргумента, здесь form . Каждое предложение имеет следующий синтаксис: (type . body. ) , где type — это имя типа и . body. одно или несколько выражений (неявное progn ): последнее значение — это возвращаемое значение typecase , если аргумент соответствует типу type .

В первом предложении (atom 1) говорится: , если форма является атомом, вернуть 1 . Следующий (cons . ) говорит: иначе, если форма является конс-ячейкой, . . Здесь atom является именем тип, представляющий все, что не является cons . Конечно, если вы знаете, что что-то не является атомом, вы знаете, что это обязательно cons , а второй тест является избыточным. Тем не менее, он более читабелен, и любой приличный компилятор оптимизирует второй тест.

Также есть функция с именем atom , который является предикатом, который проверяет, является ли значение атомом. Вот почему, когда вы пишете (atom 1) самостоятельно, в REPL он возвращает T.

См. Также wikipedia и Практический общий Lisp Сейбеля глава о списках.

Ваша функция имеет две проблемы. Первый, аккуратно описанный в ответе coredump, заключается в том, что ваш COUNT-ATOMS рекурсивен только на хвосте (>) и не забудьте вернуться к элементу CAR вашей ячейки cons ( L ). Таким образом, он не может сосчитать атом B .

Вторая проблема заключается в том, что вы считаете NIL как 0 , а это атом, и его следует считать 1 .

Источник

Число атомов в дереве, функция

Доброго времени суток. Есть ф-ия, реализующая подсчет кол-ва атомов в дереве, включая хвосты:

(defun foo2 (L) (cond ((null L) 1) ((listp (car L)) (+ (foo2 (cdr L)) (foo2 (car L)))) (T (+ 1 (foo2 (cdr L))))))

Вроде работает, но проблемы при работе с деревьями:

(foo2a '((1) ((2)((5)) ((6)) ) ((3)((7)) ((8)) ) ((4)((9)) ((10)))

На выходе после такого вызова получаем ответ «30». Даже с учетом нилов 30 атомов в этом дереве явно нет, обнаружить косяк в коде не удалось. Есть идеи?

Читайте также:  Чем обрабатывают деревья до цветения от вредителей

Добавлено через 1 час 1 минуту
Или даже вот простой пример:

Определить число атомов в железном ключе средних размеров. Найти длину цепочки, составленной из этих атомов
Определить число атомов в железном ключе средних размеров. Найти длину цепочки, составленной из.

Функция атомов
Всем привет! Подскажите как это сделать? :help: Опишите функцию, которая из исходного.

Функция для проверки одинаковых атомов
Открыла впервые Lisp и понятия не имею,как можно реализовать задачу.Подскажите,пожалуйста Задача.

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

Эксперт С++

(defun foo2 (tree) (if (null tree) 0 (+ (foo2 (cdr tree)) (if (listp (car tree)) (foo2 (car tree)) 1))))
CL-USER> (foo2 '(a)) 1 CL-USER> (foo2 '(1 (2 3 (4 5)) (6 (7 (8 9) 10)))) 10 CL-USER>

Источник

Химический состав древесины и коры. Характеристика органических веществ

Древесина состоит преимущественно из органических веществ (99 % общей массы), в состав которых входят углерод (С), водород (Н), кислород (О) и немного азота (N).

Элементный химический состав древесины разных пород практически одинаков. Абсолютно сухая древесина в среднем содержит 49-50 % углерода, 43-44 % кислорода, 6 % водорода и всего лишь 0,1-0,3 % азота. Элементный химический состав древесины ствола и ветвей различается мало. При сжигании древесины остается ее неорганическая часть — зола (0,1-1 %). В состав золы входят кальций, калий, натрий, магний; в меньших количествах фосфор, сера и другие элементы. Большая часть (75-90 %) образованных ими минеральных веществ нерастворима в воде. Среди растворимых веществ преобладают карбонаты калия и натрия, а среди нерастворимых — соли кальция.

Больше золы дает кора. Так, стволовая древесина дуба образовала при сгорании 0,35 % золы, а кора — 7,2 %. Древесина ветвей образует больше золы, чем древесина ствола: ветви березы дают при сгорании 0,64 % золы, а стволовая древесина — 0,16 %. Древесина верхней части ствола дает больше золы, чем нйжняя.

Основными органическими веществами древесины являются целлюлоза, лигнин и гемицеллюлозы, которые, как уже отмечалось, входят в состав клеточных стенок. Содержание указанных веществ зависит от породы. По данным А. В. Бурова и А. В. Оболенской, в древесине хвойных пород целлюлозы 35-52%, лигнина 25-30 %, гемицеллюлоз 22-30 % (в том числе пентозанов 5-11 % и гексозанов 9-13%). В древесине лиственных пород несколько меньше целлюлозы (31-50 %) и лигнина (20-28%), но больше гемицеллюлоз (19-35 %), причем среди гемицеллюлоз преобладают пентозаны (16-29 %) и гораздо меньше гексозанов (до 6 %).

Целлюлоза — линейный полимер, полисахарид с длинной гибкой цепной молекулой. Формула целлюлозы (С6Н10О5)n, где n — степень полимеризации, составляющая 5000-10000. Это очень стойкое вещество, не растворимое в воде и обычных органических растворителях (спирте, эфире и др.), белого цвета, плотностью 1,54-1,58 г/см 3 .

Читайте также:  Фэн шуй денежные деревья

Гемицеллюлозы — группа полисахаридов, в которую входят пентозаны (С5Н8O4)n, содержащие пять атомов углерода в элементарном звене, и гексозаны (С6Н10О5)n, имеющие, как и целлюлоза, шесть атомов углерода в звене. Однако у всех гемицеллюлоз степень полимеризации гораздо меньше (60-200), что свидетельствует о более коротких, чем у целлюлозы, цепочках молекул.

Лигнин — аморфный полимер ароматической природы (полифенол) сложного строения; содержит больше углерода и меньше кислорода, чем целлюлоза. Лигнин химически менее стоек, легко окисляется, взаимодействует с хлором, растворяется при нагревании в щелочах, водных растворах сернистой кислоты и ее кислых солей. Цвет лигнина (от светло-желтого до темно-коричневого) зависит от способа его выделения из древесины; плотность 1,25-1,45 г/см 3 .

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

У хвойных пород (сосна, лиственница) в заболони целлюлозы и лигнина больше, чем в ядре. У некоторых лиственных пород (ясень, дуб, тополь) целлюлозы несколько больше в ядре. Древесина лиственницы (ядро) и дуба (ядро и заболонь) отличается повышенным содержанием водорастворимых экстрактивных веществ. В поздней древесине сосны, лиственницы содержится немного больше целлюлозы, чем в ранней древесине.

Элементный химический состав коры мало отличается от состава древесины, но кора содержит гораздо меньше целлюлозы и значительно больше экстрактивных и минеральных веществ. Как было указано ранее, в корке содержится суберин, которого нет в древесине. В корке березы — бересте — помимо суберина содержится бетулин, придающий ей характерный белый цвет.

Источник

Функция атомов

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

Число атомов в дереве, функция
Доброго времени суток. Есть ф-ия, реализующая подсчет кол-ва атомов в дереве, включая хвосты: .

Функция для проверки одинаковых атомов
Открыла впервые Lisp и понятия не имею,как можно реализовать задачу.Подскажите,пожалуйста Задача.

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

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

Лучший ответ

Сообщение было отмечено bartle как решение

Решение

(defun smbs (w &aux (v (copy-list w))) (remove-if-not #'symbolp (flatten v))) (defun flatten (w) (if (listp w) (mapcan #'flatten w) `(,w))) > (smbs '(((a)) (1 (b 2)) (c) 3)) (A B C)

Супер! А как из этого сделать вот так?

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

(defun sum-deep (w) (when w (cons (reduce #'+ (flatten w)) (sum-deep (cdr w))))) (defun flatten (w &optional ac) (cond ((null w) ac) ((atom w) (cons w ac)) ((flatten (car w) (flatten (cdr w) ac))))) > (sum-deep '(((100) 50) (1 (2 3) 4) (1000) 400)) (1560 1410 1400 400)

Эксперт функциональных языков программированияЭксперт Python

(defun f (list) (apply '+ (mapcar (lambda (x) (if (numberp x) x (f x))) list))) (defun task (list) (maplist 'f list)) (task '(((100) 50) (1 (2 3) 4) (1000) 400)) ==> (1560 1410 1400 400)
(defun sum-deep (w) (loop for d on w collect (reduce #'+ (flatten d)))) (defun flatten (w &optional ac) (cond ((null w) ac) ((atom w) (cons w ac)) ((flatten (car w) (flatten (cdr w) ac))))) > (sum-deep '(((100) 50) (1 (2 3) 4) (1000) 400)) (1560 1410 1400 400)
(defun sum-deep (w) (loop for d on w collect (deep d))) (defun deep (w &optional (z 0)) (cond ((null w) z) ((atom w) (+ w z)) ((deep (car w) (deep (cdr w) z))))) > (sum-deep '(((100) 50) (1 (2 3) 4) (1000) 400)) (1560 1410 1400 400)
(defun sum-deep (w) (loop for d on w collect (deep d))) (defun deep (w) (reduce #'+ w :key #'(lambda (a) (if (listp a) (deep a) a)))) > (sum-deep '(((100) 50) (1 (2 3) 4) (1000) 400)) (1560 1410 1400 400)
(defun sum-deep (w) (loop for d on w collect (deep d))) (defun deep (w) (loop for a in w sum (if (listp a) (deep a) a))) > (sum-deep '(((100) 50) (1 (2 3) 4) (1000) 400)) (1560 1410 1400 400)
(defun sum-deep (w) (loop for d on w collect (deep d))) (defun deep (w) (loop for a in w if (listp a) sum (deep a) else sum a)) > (sum-deep '(((100) 50) (1 (2 3) 4) (1000) 400)) (1560 1410 1400 400)
(defun sum-deep (w) (maplist #'deep w)) (defun deep (w) (loop for a in w sum (if (listp a) (deep a) a))) > (sum-deep '(((100) 50) (1 (2 3) 4) (1000) 400)) (1560 1410 1400 400)

Добавлено через 1 минуту
Ребятушки, последний вопрос.

Читайте также:  Человек изучающий деревья называется

как описать функцию, которая, выдавала бы элемент списка по заданному
номеру, считая от конца, учитывая элементы подсписков. Например, результатом
применения функции к аргументам ’2 ’(a (b c (d)) e) должен быть ’d
(второй с конца)

(defun n-end (n w) (car (last (flatten w) n))) (defun flatten (w &optional ac) (cond ((null w) ac) ((atom w) (cons w ac)) ((flatten (car w) (flatten (cdr w) ac))))) > (n-end 2 '(a (b c (d)) e)) D

Источник

Число атомов в дереве

Однако (COUNT-ATOMS ‘(A (B) C)) возвращает 2. Как мне сделать, чтобы вернуть 5? Не могли бы вы объяснить более подробно?

Если вы хотите построить (a (b) c) во время выполнения, используя только cons и quote , вы должны написать:

(cons 'a 
(cons (cons 'b nil)
(cons 'c nil)))

В построенном дереве 5 атомов (a, b, c и два ноля). На практике вы можете использовать более простую нотацию, например (list ‘a (list ‘b) ‘c) . В вашей функции вы не переучиваете CARS своих деревьев, а только CDRS. Кроме того, когда CAR не является атомом, например, когда вы сталкиваетесь (B) , вы добавляете нуль (условие по умолчанию во втором cond ) (отредактируйте. Как отметил kmkaplan, вы также считаете нуль для nil, first cond). Это простое решение, основанное на typecase :

(defun count-atoms (form) 
(typecase form
(atom 1)
(cons (+ (count-atoms (car form))
(count-atoms (cdr form))))))
    Когда вы сталкиваетесь с атомом, результат равен 1. Когда у вас есть ячейка cons, вы суммируете количество атомов в своем автомобиле и cdr.

У вашей функции две проблемы. Первый, аккуратно описанный в ответе coredump, заключается в том, что ваш COUNT-ATOMS ATOMS рекрутирует только на хвосте ( CDR ) и забывает перезаписывать элемент CAR вашей ячейки cons ( L ). Таким образом, он не учитывает атом B
Вторая проблема заключается в том, что вы считаете NIL равным 0 когда он является атомом, и его следует считать равным 1 .

Источник

Оцените статью