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

Генерация правильных скобочных последовательностей

14.12.2021, 13:17. Показов 1199. Ответов 5
Метки lisp (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Помогите, пожалуйста, написать программу на языке lisp, которая строит все правильные скобочные последовательности длиной n (n>0). Например, при n=2 программа должна вывести ()() и (()). Заранее спасибо
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2021, 13:17
Ответы с готовыми решениями:

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

Получить список всех правильных скобочных последовательностей
Правильная скобочная последовательность — это такая последовательность, которая могла быть...

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

Найти количество правильных скобочных последовательностей из n скобок, где n четное число.
Найти количество правильных скобочных последовательностей из n скобок, где n четное число....

5
155 / 135 / 9
Регистрация: 21.10.2012
Сообщений: 413
23.01.2022, 12:01 2
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun lb (n) (format t "~A" "(")
  (cond ((> n 1) (lb (- n 1)))))
    
(defun rb (n) (format t "~A" ")")
  (cond ((> n 1) (rb (- n 1)))))
  
(defun lrb (n)
  (format t "~A" "(")
  (format t "~A" ")")
  (cond ((> n 1) (lrb (- n 1)))))  
    
(lb 3) (rb 3) (lrb 3)
==> ((()))()()()
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36609 / 20336 / 4222
Регистрация: 12.02.2012
Сообщений: 33,660
Записей в блоге: 13
23.01.2022, 13:50 3
chessman2, боюсь, Ваше решение неполное... Как вариант (HomeLisp):

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(defun task (n)
  (if (= n 1) (list "()")
      (let ((prev (task (- n 1)))
            (res nil))
        (iter (for seq in prev) (collecting (strCat "(" seq ")") into res)
                                (collecting (strCat "()" seq) into res)
                                (collecting (strcat seq "()") into res)) 
        (setof res))))
         
(task 3)
==> ("((()))" "()(())" "(())()" "(()())" "()()()")
 
(task 4)
==> ("(((())))" "()((()))" "((()))()" "(()(()))" "()()(())" "((())())" "()(())()" "(())()()" "((()()))" "()(()())" "(()())()" "(()()())" "()()()()")
3
0 / 0 / 0
Регистрация: 10.11.2021
Сообщений: 9
24.01.2022, 23:47  [ТС] 4
Catstail, спасибо большое. А не могли бы Вы подсказать еще такой момент: с лиспом я знаком не очень хорошо, поэтому не получилось переделать данный код под рекурсивную программу (цикл заменить рекурсивным вызовом функции). Не могли бы Вы с этим помочь, пожалуйста? Заранее спасибо
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36609 / 20336 / 4222
Регистрация: 12.02.2012
Сообщений: 33,660
Записей в блоге: 13
25.01.2022, 06:30 5
Лучший ответ Сообщение было отмечено s517681756 как решение

Решение

s517681756, вот чистая рекурсия:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(defun next-seq (seq &optional (acc nil))
  (if (null seq) (setof acc)
      (let ((curr (car seq)))
        (next-seq (cdr seq) (append (list (strCat "(" curr ")") (strCat "()" curr) (strCat curr "()")) acc)))))  
  
(defun task (n)
  (if (= n 1) (list "()")
      (let ((prev (task (- n 1))))
            (next-seq prev)))) 
 
(task 3)
==> ("(()())" "()()()" "((()))" "()(())" "(())()")
 
(task 5)
 
==> ("((()())())" "(()())()()" "(()(()()))" "()()(()())" "()(()())()" "(((()())))" "()((()()))" "((()()))()"
         "(()()()())" "()()()()()" "((()()()))" "()(()()())" "(()()())()" "(((()))())" "((()))()()" "(()((())))" 
         "()()((()))" "()((()))()" "((((()))))" "()(((())))" "(((())))()" "(()(())())" "(()()(()))" "()()()(())" 
         "()()(())()" "((()(())))" "()(()(()))" "(()(()))()" "((())()())" "()(())()()" "(())()()()" "(((())()))"
         "()((())())" "((())())()")
setof - стандартная функция построения множества из списка. Она написана на Лиспе и тоже использует рекурсию.
2
0 / 0 / 0
Регистрация: 10.11.2021
Сообщений: 9
25.01.2022, 09:25  [ТС] 6
Catstail, Спасибо большое
0
25.01.2022, 09:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.01.2022, 09:25
Помогаю со студенческими работами здесь

Рекурсия: генерация правильных скобочных структур длины 2n
Привет , уважаемые форумчане! Рекурсия и Рекурсивные алгоритмы! Искал данное задание негде нету ,...

Рекурсия: генерация всех правильных скобочных структур длины 2n
Число правильных скобочных структур длины 6 равно 5: ()()(), (())(), ()(()), ((())), (()())....

Рекурсия: генерация всех правильных скобочных структур длины 2n
Число правильных скобочных структур длины 6 равно 5: ()()(), (())(), ()(()), ((())), (()())....

Количество правильных скобочных выражений
Читается число n. Есть последовательность скобок "(" и ")" длинной 2n. Найти количество правильных...

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

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


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

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