2 / 2 / 0
Регистрация: 14.09.2014
Сообщений: 82
1

Вернуть список позиций вхождения list2 в list1 и глубину нахождения list2 в list1

27.09.2016, 22:53. Показов 1350. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Делаю не на лиспе, но язык такой же практически, немного названия функций другие.
Задание: написать функцию, возвращающую список позиций вхождения list2 в list1 и глубину нахождения list2 в list1.
Сделала для возвращения глубины. Подскажите как доделать до нужного результата?
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
;count - счетчик списков на текущей глубине
;newL - список элементов на следующей глубине
 
#lang racket
(define (fun L A1)
  (define (fun-iter L newL tekGlubina count)
    (if (null? L)
        (if (= count 0) tekGlubina
            (fun-iter newL '() (+ tekGlubina 1) 0))
        (let ((fstL (car L)))
          (if (list? fstL)
              (fun-iter (cdr L) (append fstL newL) tekGlubina (+ count 1))
              (fun-iter (cdr L) newL tekGlubina count)))))
  (fun-iter L '() 1 0))
 
(fun '(1 ((1)) 5 6) 1)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2016, 22:53
Ответы с готовыми решениями:

Определить функцию NCONC(list1, list2.listn)
Ребят, подскажите, как такую задачу решить на лиспе. Определить функцию NCONC(list1,...

Построить класс для работы с односвязным списком. Создать два списка: List1 и List2. Проверить, содержатся ли элементы списка List1 в списке List2 в у
Построить класс для работы с односвязным списком. Создать два списка: List1 и List2. Проверить,...

Проверить, содержатся ли элементы списка List1 в списке List2 в указанном списком List1 порядке
Проверить, содержатся ли элементы списка List1 в списке List2 в указанном списком List1 порядке ...

сформировать списки list1 и list2
Помогите пожалуйста решить задачу. Со списками вообще беда. Сформировать списки List1 List2 из...

10
Модератор
Эксперт функциональных языков программированияЭксперт Python
36587 / 20317 / 4218
Регистрация: 12.02.2012
Сообщений: 33,614
Записей в блоге: 13
28.09.2016, 10:12 2
Kris123, приведи пример исходных данных и того, что должно получиться.
0
2 / 2 / 0
Регистрация: 14.09.2014
Сообщений: 82
28.09.2016, 19:32  [ТС] 3
Чуть-чуть изменилась формулировка: Функция должна возвращать список, содержащий информацию о количестве подсписков на каждом уровне вложенности ((<уровень> <количество подсписков>)...)
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36587 / 20317 / 4218
Регистрация: 12.02.2012
Сообщений: 33,614
Записей в блоге: 13
29.09.2016, 10:15 4
Вот есть список (a b (c d) ((e f ((g h) (i j) k)))). Что должна вернуть функция?
0
2 / 2 / 0
Регистрация: 14.09.2014
Сообщений: 82
01.10.2016, 12:21  [ТС] 5
(1 2) (2 1) (3 1) (4 2)
1-й уровень: (c d) ((e f ( (g h) (i j) k)))
2-й: (e f ( (g h) (i j) k))
3-й: ( (g h) (i j) k)
4-й: (g h) (i j)
0
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
01.10.2016, 18:43 6
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(defun dive-count (n w &aux (a (car w)) (d (cdr w)))
   (cond ((null w) 0)
         ((= n 0) (count-if #'listp w))
         ((atom a) (dive-count n d))
         ((+ (dive-count (1- n) a) (dive-count n d)))))
 
(defun max-depth (w)
  (if (atom w)
      -1
      (max (1+ (max-depth (car w)))
           (max-depth (cdr w)))))
 
(defun level-number-of-lists (w &aux (n (1- (max-depth w))))
  (loop for a from 0 to n
        collect (list a (dive-count a w))))
 
> (level-number-of-lists '(a b (c d) ((e f ((g h) (i j) k)))))
((0 2) (1 1) (2 1) (3 2))
1
2 / 2 / 0
Регистрация: 14.09.2014
Сообщений: 82
01.10.2016, 18:47  [ТС] 7
Спасибо большое! Я, конечно, извиняюсь, но можно это как-то сделать в одной функции с хвостовой рекурсией?!
0
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
01.10.2016, 19:22 8
вариант "простая рекурсия":
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(defun dive-count (n w &aux (a (car w)) (d (cdr w)))
   (cond ((null w) 0)
         ((= n 0) (count-if #'listp w))
         ((atom a) (dive-count n d))
         ((+ (dive-count (1- n) a) (dive-count n d)))))
 
(defun max-depth (w)
  (if (atom w)
      -1
      (max (1+ (max-depth (car w)))
           (max-depth (cdr w)))))
 
(defun level-number-of-lists (w &optional (n (max-depth w)) (m 0))
  (when (< m n) (cons (list m (dive-count m w)) 
              (level-number-of-lists w n (1+ m)))))
 
> (level-number-of-lists '(a b (c d) ((e f ((g h) (i j) k)))))
((0 2) (1 1) (2 1) (3 2))
Добавлено через 40 секунд
вариант "хвостовая рекурсия"
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(defun dive-count (n w &aux (a (car w)) (d (cdr w)))
   (cond ((null w) 0)
         ((= n 0) (count-if #'listp w))
         ((atom a) (dive-count n d))
         ((+ (dive-count (1- n) a) (dive-count n d)))))
 
(defun max-depth (w)
  (if (atom w)
      -1
      (max (1+ (max-depth (car w)))
           (max-depth (cdr w)))))
 
(defun level-number-of-lists (w &optional ac (n (max-depth w)) (m 0))
  (if (< m n)
      (level-number-of-lists w
                 (cons (list m (dive-count m w))
                   ac)
                 n
                 (1+ m))
      (reverse ac)))
 
> (level-number-of-lists '(a b (c d) ((e f ((g h) (i j) k)))))
((0 2) (1 1) (2 1) (3 2))
Добавлено через 15 минут
вариант "одна функция":
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
(defun level (w
          &optional
          ac
          (n (labels ((max-depth (v)
                (if (atom v)
                -1
                (max (1+ (max-depth (car v)))
                     (max-depth (cdr v))))))
           (max-depth w)))
          (m 0))
  (if (< m n)
      (level w
         (cons (list m
             (labels ((dive-count (n
                           v
                           &aux
                           (a (car v))
                           (d (cdr v)))
                    (cond ((null v) 0)
                      ((= n 0) (count-if #'listp v))
                      ((atom a) (dive-count n d))
                      ((+ (dive-count (1- n) a)
                          (dive-count n d))))))
               (dive-count m w)))
           ac)
         n
         (1+ m))
      (reverse ac)))
 
> (level '(a b (c d) ((e f ((g h) (i j) k)))))
((0 2) (1 1) (2 1) (3 2))
2
Модератор
Эксперт функциональных языков программированияЭксперт Python
36587 / 20317 / 4218
Регистрация: 12.02.2012
Сообщений: 33,614
Записей в блоге: 13
02.10.2016, 09:37 9
Еще решение:

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
(defun task (lst &optional (lv 1))
  (cond ((null lst) 0)
        ((= lv 1) (count-if #'listp lst))
        (t (apply '+ (mapcar #'(lambda (x) (if (atom x) 0 (task x (- lv 1)))) lst)))))
 
==> TASK
 
(task '(a b (c d) ((e f ((g h) (i j) k)))) 2)
 
==> 1
 
(task '(a b (c d) ((e f ((g h) (i j) k)))) 1)
 
==> 2
 
(task '(a b (c d) ((e f ((g h) (i j) k)))) 3)
 
==> 1
 
(task '(a b (c d) ((e f ((g h) (i j) k)))) 4)
 
==> 2
 
(task '(a b (c d) ((e f ((g h) (i j) k)))) 5)
 
==> 0
Или даже так (без явной терминальной ветви):

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(defun task (lst &optional (lv 1))
  (apply '+ (mapcar #'(lambda (x) 
                        (if (= lv 1)
                            (if (atom x) 0 1)
                            (if (atom x) 0 (task x (- lv 1))))) lst)))
 
==> TASK
 
(task '(a b (c d) ((e f ((g h) (i j) k)))) 5)
 
==> 0
 
(task '(a b (c d) ((e f ((g h) (i j) k)))) 4)
 
==> 2
 
(task '(a b (c d) ((e f ((g h) (i j) k)))) 2)
 
==> 1
 
(task '(a b (c d) ((e f ((g h) (i j) k)))) 1)
 
==> 2
Добавлено через 10 минут
Kris123, имей в виду, что приведены решения для Лиспа, а не для Схемы.
2
2 / 2 / 0
Регистрация: 14.09.2014
Сообщений: 82
07.10.2016, 18:04  [ТС] 10
Вот программа на Scheme. Работает, при (a b (c d) ((e f ((g h) (i j) k))))
ответ '((0 2) (1 1) (2 1) (3 2)), это правильно.
Но при (a b (c d) ((e f ((g h) (i () j) k)))) - ответ такой же, т.е. не появляется (4 1), если просто пустой список. Помогите, пожалуйста, исправить.
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#lang racket
(define (func L)
  (define (inter L newL lvl count result)
    (cond
      [(null? L) (if (null? newL) (reverse result)
                     (inter newL '()
                            (+ lvl 1)
                            0
                            (cons (list lvl count)
                                  result)))]
      [(list? (car L)) (inter (cdr L) (append (car L) newL)
                              lvl
                              (+ count 1)
                              result)]
      [else (inter (cdr L) newL lvl count result)]))
  (inter L '() 0 0 '()))
 
(func '(a b (c d) ((e f ((g h) (i () j) k)))))
(func '(a b (c d) (e)))
(func '(a b ((c d) (e))))
1
188 / 155 / 17
Регистрация: 18.12.2015
Сообщений: 179
08.10.2016, 00:42 11
Kris123, мне такой вариант пришёл в голову:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#lang racket
 
(define (func L)
  (define (inter L newL lvl count result)
    (cond
      [(null? L) (if (null? newL) (reverse result)
                                  (inter newL
                                         '()
                                         (+ lvl 1)
                                         0
                                         (cons (list lvl count)
                                         result)))]
      [(list? (car L)) (inter (cdr L)
                              (append (cons 1 (car L)) newL)
                              lvl
                              (+ count 1)
                              result)]
      [else (inter (cdr L) newL lvl count result)]))
  (inter L '() 0 0 '()))
2
08.10.2016, 00:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2016, 00:42
Помогаю со студенческими работами здесь

Определить предикат P(List1, list2, list3)
Помогите решить, пожалуйста: 1.определить предикат P(List1, list2, list3), который истинен, если...

Задание отношение shift(List1,List2)
Помогите с задачками Определить отношение shift(List1,List2) таким образом, чтобы список List2 ...

Список List2 получен из списка List1 организацией всех нечётных чисел в подсписок, размещаемый в конце списка
Помогите написать программу nechyot(List1,List2). Список List2 получен из списка List1 организацией...

За линейное время заменить каждый элемент list1 его номером в list2
Например, list1: { 147, 256, 147, 333, 256, 168, 961, 256, 729, 961, 333 }; list2: { 147, 256, 333,...


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

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

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