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

Рекурсивный проход по списку. Вложенность

27.01.2020, 15:33. Показов 731. Ответов 5

Author24 — интернет-сервис помощи студентам
По следам недавней темы.

Дается список

Lisp
1
'(a b c (d e (f g (O U Y))) j x y)
нужно получить

Lisp
1
'("abc" ("de" ("fg" ("YUO"))) "yxj")
Мое решение, которое нуждается в доработке. Хотелось бы так же увидеть лучшие варианты решения от более опытных товарищей.

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
(define (lst? lst)
  (if (empty? lst)
      #f
      (if (list? (car lst))
          #t
          (lst? (rest lst)))))
 
 
(lst? '(a b c (d e (f g (O U Y))) j x y))
 
=> #t
 
(define (revstr str)
  (let ([st (string->list str)])
    (let loop ([st st])
    (if (empty? st)
        ""
    (string-append  (string (last st)) (loop (remove (last st) st)))))))
 
(revstr "psiL")
 
=> "Lisp"
 
(define (str lst [acc ""])
  (cond ((empty? lst) (cons acc lst))
        ((list? (car lst))
          (cons (revstr acc) (list (str (if (lst? (car lst)) (append (car lst) (rest lst))  (car lst)) ""))))
          (#t (str (rest lst) (string-append (symbol->string (car lst)) acc)))))
 
(str '(a b c (d c a (f z (w w))) z x e))
 
=> ("abc" ("dca" ("fz" ("ww"))))
 
 
 
(define (fun lst [acc ""])
  (if (empty? lst)
      (cons acc lst)
      (if (symbol? (car lst))
          (fun (rest lst) (string-append (symbol->string (car lst)) acc))
          (append  (if (list? (car lst)) (list (revstr acc) (str (car lst))) acc) (fun (rest lst) "")))))
 
 
(fun '(a b c (d e (f g (O U Y))) j x y))
 
=>'("abc" ("de" ("fg" ("YUO"))) "yxj")
Проблема в том, что функция str вернет

Lisp
1
'("abc" ("de" ("fg" ("YUO"))) "yxj")
если скормить ей

Lisp
1
(fun '(a b c (d e (f g (O U Y) M I L K)) j x y))
Добавлено через 14 минут
Забыл кое-что

Lisp
1
2
3
4
5
6
7
8
9
10
(define (fun lst [acc ""])
  (if (empty? lst)
      (cons (revstr acc) lst)
      (if (symbol? (car lst))
          (fun (rest lst) (string-append (symbol->string (car lst)) acc))
          (append  (if (list? (car lst)) (list (revstr acc) (str (car lst))) acc) (fun (rest lst) "")))))
 
 
(fun '(a b c (d e (f g (O U Y) M I L K)) j x y))
=> '("abc" ("de" ("fg" ("OUY"))) "jxy")
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.01.2020, 15:33
Ответы с готовыми решениями:

Рекурсивный проход по списку символов
Здравствуйте. Прошу помочь с решением задачи (Common Lisp) на рекурсию. Задача: рекурсивно пройти...

Проход по списку
Вот код: numbers = sequence = j = 0 i = 0 while j + 3 != len(numbers): j += 1 for i...

Рекурсивный проход
Рекурсивный проход по всем каталогам в заданной директории, удалить все файлы из директории,...

Проход по списку с удаление элементов
Доброе время суток, есть ArrayList<Object>(); нужно: 1. взять элемент 2. выполнить действие с...

5
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
27.01.2020, 15:42 2
В HomeLisp это будет так:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun task (list &optional (acc ""))
  (cond ((null list) (if (eq "" acc) nil (list acc)))
        ((atom (car list)) (task (cdr list) (strCat acc (implode (append (list '&dq) (explode (car list)) (list '&dq))  ))))
        (t (cons acc (cons (task (car list) "") (task (cdr list) ""))))))
 
==> TASK
 
(task '(a b c (d e (f g (O U Y))) j x y))
==> ("ABC" ("DE" ("Fg" ("OUY"))) "jXY")
 
(task '(a b c (d e (f g (O U Y) M I L K)) j x y))
==> ("ABC" ("DE" ("Fg" ("OUY") "MILK")) "jXY")
1
Заблокирован
27.01.2020, 16:57  [ТС] 3
Catstail, а что функции inplode и explode делают?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
27.01.2020, 17:32 4
sodda, а... Это моя самоделка (но в какой-то из старых версий Лиспа я подглядел, так что не сам придумал).

Lisp
1
2
3
4
5
(explode 'qwerty)
==> (Q W E R T Y)
 
(implode  '(q w e r t y))
==> QWERTY
А употребление спец. атома &DQ позволяет превратить атом в строку:

Lisp
1
2
(implode  '(&DQ q w e r t y &DQ))
==> "QWERTY"
1
Заблокирован
27.01.2020, 19:31  [ТС] 5
Catstail, понятно
0
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
29.01.2020, 01:30 6
Цитата Сообщение от sodda Посмотреть сообщение
Хотелось бы так же увидеть лучшие варианты
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#lang racket
 
(define (strings xs)
  (define (cons-str s list)
    (match s
      (""  list)
      (_  (cons s list))))
  (for/fold ((result '())
             (buffer "")
             #:result (reverse (cons-str buffer result)))
            ((x xs))
    (match x
      ((? symbol?)
       (values result
               (string-append buffer (symbol->string x))))
      ((? list?)
       (values (cons (strings x) (cons-str buffer result))
               ""))
      (_ (error 'strings "expected symbol? or list?, given: ~s" x)))))
 
(define (main)
  (printf "~s~n" (strings '(a b c (d e (f g (O U Y))) j x y))))
2
29.01.2020, 01:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.01.2020, 01:30
Помогаю со студенческими работами здесь

Проход по списку без цикла
Добро всем :senor: у меня в Image1 загружаются фотографии с определенной папки, названия файлов...

Как реализовать полный проход по списку?
Здравствуйте. Использую AMZI Prolog. Есть несколько предикатов: price(Arg,,)....

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

Рекурсивный проход по всем папкам и удаление файла по имени
Добрый день Пытаюсь сделать скрипт для который бы проходил по всем папкам на сервере и удалял...


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

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