Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 05.12.2017
Сообщений: 3
1

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

17.01.2018, 15:26. Показов 1820. Ответов 5

Author24 — интернет-сервис помощи студентам
Пожалуйста, помогите. Уже весь мозг себе сломала. Т-Т
Есть задание - "Напишите функцию, которая по заданному дереву строит новое дерево только тех элементов данного дерева, которые оканчиваются на 7".
Вот код программы. Тут по сути просто реализовано удаление элемента из дерева. Проблемы две: 1) удаляется только один элемент, а не все его вхождения. 2)Получается, нужно удалить все вхождения функции, которая отвечает за проверку элементов на конец 7. сама функция тоже почему-то удаляет только первое вхождение, а не все.
Функция для поиска элементов, кончающихся на 7:
Lisp
1
2
3
4
5
 (defun atm (n &optional (r nil) )        
(cond ((null n) nil)                       
((= (rem (car n) 10) 7) (cons (car n) r))  
(t ( atm (cdr n) r))                       
))
Сама функция удаления элемента:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
(DEFUN DELETE (ATM &optional TREE)
(SETQ SUBTREE (SEARCH ATM TREE))
      (COND ( (NULL SUBTREE) (PRINT "usla v dereve net") )
            (  T
                 (COND ( (EQUAL SUBTREE (LIST ATM NIL NIL))
                          ; uzel list
                          (REPLACE SUBTREE NIL TREE)
                       )
                       ( (AND (NOT (NULL (LEFT  SUBTREE)))
                              (NOT (NULL (RIGHT SUBTREE))))
                            (SETQ UZEL
                              (RIGHTLIST (LEFT SUBTREE)))
                            (RPLACA SUBTREE UZEL)
                            (COND ( (NULL (RIGHT
                                           (LEFT SUBTREE)))
                                    (REPLACE (LEFT SUBTREE)
                                      (CADR (LEFT SUBTREE))
                                             TREE) )
                                  ( (NULL (LEFT
                                           (LEFT SUBTREE)))
                                    (REPLACE (LEFT SUBTREE)
                                      (CADDR (LEFT SUBTREE))
                                             TREE) )
                                  (  T  (REPLACE (LIST UZEL
                                                  NIL NIL)
                                                 NIL TREE) )
                            )
                       )
                       ( (NULL (RIGHT SUBTREE))
                             (REPLACE SUBTREE (CADR SUBTREE)
                                      TREE)
                       )
                       ( (NULL (LEFT SUBTREE))
                             (REPLACE SUBTREE (CADDR SUBTREE)
                                      TREE)
                       )
                 )
            )
      )
   )


Ну и весь код на всякий случай.
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
 (DEFUN ROOT (&optional TREE)
      (CAR TREE))
   (DEFUN LEFT (&optional TREE)
      (CADR TREE))
(DEFUN RIGHT (&optional TREE)
      (CADDR TREE))
 (DEFUN RIGHTLIST (&optional TREE)
      (COND ( (NULL (RIGHT TREE)) (CAR TREE) )
            (  T  (RIGHTLIST (RIGHT TREE)) )
      ))
 
   (DEFUN LEFTLIST (&optional TREE)
 
       (COND ( (NULL (LEFT TREE)) (CAR TREE) )
             (  T  (LEFTLIST (LEFT TREE)) )
       )
   )
  (DEFUN SEARCH (A &optional TREE)
      (COND ( (NULL TREE)          NIL  )
            ( (EQUAL A (CAR TREE)) TREE )
            ( (< A (CAR TREE)) (SEARCH A (CADR  TREE)) )
            (          T           (SEARCH A (CADDR TREE)) )
      )
   )
 
   (DEFUN REPLACE (OLD &optional NEW LST)
 
      (COND ( (ATOM LST) LST )
            ( (EQUAL OLD LST) NEW )
            (  T  (CONS (REPLACE OLD NEW (CAR LST))
                        (REPLACE OLD NEW (CDR LST))) )
      )
   )
(DEFUN DELETE1 (ATM &optional TREE)
 
      (COND ( (NULL TREE) NIL )
            ( (< ATM (ROOT TREE))
                 (LIST (CAR TREE)
                       (DELETE1 ATM (LEFT TREE))
                       (RIGHT TREE))
            )
            ( (> ATM (ROOT TREE))
                 (LIST (CAR TREE)
                       (LEFT TREE)
                       (DELETE1 ATM (RIGHT TREE)))
            )
            (  T  (COND ( (NULL (RIGHT TREE)) (LEFT  TREE) )
                        ( (NULL (LEFT  TREE)) (RIGHT TREE) )
                        (  T  (LIST (UD (LEFT TREE))
                                    (DELETE1
                                        (UD (LEFT TREE))
                                        (LEFT TREE))
                                    (RIGHT TREE)) )) )
      )
   )
 
 
(defun atm (n &optional (r nil) )        
(cond ((null n) nil)                       
((= (rem (car n) 10) 7) (cons (car n) r))  
(t ( atm (cdr n) r))                       
))                                         
 
 
 
   (DEFUN UD (&optional TREE)
 
      (COND ( (NULL (RIGHT TREE)) (CAR TREE) )
            (  T  (UD (RIGHT TREE)) )
      )
   )
(DEFUN DELETE (ATM &optional TREE)
(SETQ SUBTREE (SEARCH ATM TREE))
      (COND ( (NULL SUBTREE) (PRINT "usla v dereve net") )
            (  T
                 (COND ( (EQUAL SUBTREE (LIST ATM NIL NIL))
                          ; uzel list
                          (REPLACE SUBTREE NIL TREE)
                       )
                       ( (AND (NOT (NULL (LEFT  SUBTREE)))
                              (NOT (NULL (RIGHT SUBTREE))))
                            (SETQ UZEL
                              (RIGHTLIST (LEFT SUBTREE)))
                            (RPLACA SUBTREE UZEL)
                            (COND ( (NULL (RIGHT
                                           (LEFT SUBTREE)))
                                    (REPLACE (LEFT SUBTREE)
                                      (CADR (LEFT SUBTREE))
                                             TREE) )
                                  ( (NULL (LEFT
                                           (LEFT SUBTREE)))
                                    (REPLACE (LEFT SUBTREE)
                                      (CADDR (LEFT SUBTREE))
                                             TREE) )
                                  (  T  (REPLACE (LIST UZEL
                                                  NIL NIL)
                                                 NIL TREE) )
                            )
                       )
                       ( (NULL (RIGHT SUBTREE))
                             (REPLACE SUBTREE (CADR SUBTREE)
                                      TREE)
                       )
                       ( (NULL (LEFT SUBTREE))
                             (REPLACE SUBTREE (CADDR SUBTREE)
                                      TREE)
                       )
                 )
            )
      )
   )
 
(DELETE (ATM '(13 (17 nil nil) (17 nil nil))))))
'(13 (17 nil nil) (17 nil nil)))))
Добавлено через 1 минуту
Ах да, использовать можно только те функции, которые у меня есть. Т.е. никаких if, where, loop и пр. отсюда еще больше сложности -.-
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.01.2018, 15:26
Ответы с готовыми решениями:

Функция, которая строит новое дерево из элементов данного дерева, которые оканчиваются на 7
Напишите функцию, которая по заданному дереву строит новое дерево только тех элементов данного...

Найти сумму тех элементов данного массива натуральных чисел, которые кратны заданному К
Язык программирования Паскаль. Дан одномерный массив A натуральных чисел. Найти сумму тех...

Даны натуральные числа от 1 до 100.Найти сумму только тех чисел, которые оканчиваются на 3.
Даны натуральные числа от 1 до 100.Найти сумму только тех чисел, которые оканчиваются на 3.

Найти сумму тех элементов списка, которые оканчиваются на заданную цифру
Найти сумму тех элементов списка, которые оканчиваются на заданную цифру. List.fold

5
Модератор
Эксперт функциональных языков программированияЭксперт Python
36603 / 20332 / 4220
Регистрация: 12.02.2012
Сообщений: 33,649
Записей в блоге: 13
18.01.2018, 05:53 2
Лучший ответ Сообщение было отмечено Jourex как решение

Решение

Удаление из дерева - очень сложная операция. Проще построить новое дерево из исходного (тем более, что и в условии так и написано!):

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
;; Вставка в дерево поиска
 
(defun ins-in-tree (v tree)
  (cond ((null tree) (list nil v nil))
        ((<= v (cadr tree)) (list (ins-in-tree v (car tree)) (cadr tree) (caddr tree)))
        (t (list (car tree) (cadr tree) (ins-in-tree v (caddr tree))))))
 
;; Решение
 
(defun task (tree &optional (r nil))
  (cond ((null tree) r)
        (t (let* ((rl (task (car tree) r))
                  (rr (task (caddr tree) rl)))
           (cond ((= (mod (cadr tree) 10) 7) (ins-in-tree (cadr tree) rr))
                 (t rr))))))
 
;; Создаем тестовое дерево:
 
(setq *t* '((nil 6 (nil 17 nil)) 27 ((nil 7 nil) 31 (nil 47 nil)))) 
 
==> ((NIL 6 (NIL 17 NIL)) 27 ((NIL 7 NIL) 31 (NIL 47 NIL)))
 
;; Запускаем:
 
(task *t*)
 
==> ((NIL 7 NIL) 17 ((NIL 27 NIL) 47 NIL))
1
0 / 0 / 0
Регистрация: 05.12.2017
Сообщений: 3
18.01.2018, 14:35  [ТС] 3
И правда! Спасибо огромное!

Добавлено через 8 минут
Только немного не понимаю, как вы задаете дерево?

Добавлено через 2 минуты
Например, есть дерево - (5 (3 (1 nil nil) (4 nil nil)) (7 (6 nil nil)
5
3 7
1 4 6
Выглядит вроде так. Когда ввожу его, вознкиает проблема - bad argument type - 5.
Как нужно видоизменить ввод?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36603 / 20332 / 4220
Регистрация: 12.02.2012
Сообщений: 33,649
Записей в блоге: 13
18.01.2018, 16:25 4
У меня другой порядок задания дерева: (левое поддерево - вершина - правое поддерево)
0
0 / 0 / 0
Регистрация: 05.12.2017
Сообщений: 3
18.01.2018, 19:09  [ТС] 5
А нельзя ли рисунком? Вообще не понимаю, что именно там вершина... :С
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36603 / 20332 / 4220
Регистрация: 12.02.2012
Сообщений: 33,649
Записей в блоге: 13
18.01.2018, 20:21 6
Что тут непонятно? У вас (1 nil nil), а у меня (nil 1 nil). И вся разница.
0
18.01.2018, 20:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.01.2018, 20:21
Помогаю со студенческими работами здесь

Создать зеркальное дерево к заданному дереву
Вообщем есть дерево нужно создать зеркальное дерево, и найти самое большое поддерево дерева. ...

Найти произведение только тех чисел, которые больше данного М
решите пожалуйста... 4.26. Дана последовательность целых положительных чисел. Найти произведение...

Дан массив из N элементов. Определить произведение тех элементов, которые кратны заданному числу Р.
Дан массив из N элементов. Определить произведение тех элементов, которые кратны заданному числу Р....

Найти сумму тех элементов, которые кратны заданному К
Помогите с задачей. В массив A занесены натуральные числа. Найти сумму тех элементов, которые...

Построить бинарное дерево из целочисленных элементов. Найти наименьший элемент дерева
Построить бинарное дерево из целочисленных элементов. Найти наименьший элемент дерева. &lt;--- вот...

Двумерный массив. Найти произведение тех элементов, которые кратны заданному
задача :дана матрица A (N*L) найти произведение тех её элементов которые кратны L. мой код : ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru