Текст задачи:
Напишите функцию, которая составляет список строк, представляющих все способы балансировки nпар скобок.
Примеры:
balanced_parens(0) => [""]
balanced_parens(1) => ["()"]
balanced_parens(2) => ["()()","(())"]
balanced_parens(3) => ["()()()","(())()","()(())","(()())","((()))"]
Решение:
def balanced_parens(n):
if n == 0:
return [""]
if n == 1:
return ["()"]
result = []
for s in balanced_parens(n - 1):
result += [s[:i]+"()"+s[i:] for i in range(0,len(s))]
return list(set(result))
Вопрос: какие значение принимает s в balanced_parens(n-1)? Мне понятен весь код, кроме этого блока (как работают генераторы вроде как понимаю):
for s in balanced_parens(n - 1):
result += [s[:i]+"()"+s[i:] for i in range(0,len(s))]
Python
Какие значения принимает s в balanced_parens(n-1). Как вообще работает этот код?
это рекурсия
например, переход от 2 к 3:
balanced_parens(n - 1) вернул "()()", "(())"
взяли строку "()()", и подпихиваем () на все возможные позиции:
в результате работы алгоритма некоторые расстановки получаются одинаковыми
например, в вышеприведенном случае первый и последний вариант совпадают: ()()()
поэтому, чтобы избавиться от дублей, делают преобразование list -> set -> list
P.S. s[:i] и s[i:] - это так называемые срезы:
https://code-basics.com/ru/languages/python/lessons/slices
def balanced_parens(n):
# это условия выхода из рекурсии
if n == 0: return [""]
if n == 1: return ["()"]
result = []
# получаем все расстановки n-1 пар скобок
# для каждого варианта...
for s in balanced_parens(n - 1):
# ...подсовываем на все возможные позиции еще одну пару скобок
result += [s[:i]+"()"+s[i:] for i in range(0,len(s))]
# избавляемся от дублей и возвращаем результат
return list(set(result))
например, переход от 2 к 3:
balanced_parens(n - 1) вернул "()()", "(())"
взяли строку "()()", и подпихиваем () на все возможные позиции:
()()()
^^
(())()
^^
()()()
^^
()(())
^^
()()()
^^
и то же самое проворачиваем с "(())"в результате работы алгоритма некоторые расстановки получаются одинаковыми
например, в вышеприведенном случае первый и последний вариант совпадают: ()()()
поэтому, чтобы избавиться от дублей, делают преобразование list -> set -> list
P.S. s[:i] и s[i:] - это так называемые срезы:
https://code-basics.com/ru/languages/python/lessons/slices
Leo Blyum
привет, спасибо большое, про срезы я понял, саму задачу уже тоже почти понял). но почему balanced_parens(n-1) вернул ()() и (())? про ()() я еще могу понять, но какими действиями он получил (())?
Значение s в цикле for s in balanced_parens(n - 1): представляет собой каждую строку из прошлого списка результатов, который был сгенерирован на предыдущем шаге при уменьшении n на 1.
В разных итерациях s может принимать различные значения в зависимости от того, какие строки были сгенерированы на предыдущем этапе.
Выражения s[:i] и s[i:] – это срезы строки s. s[:i] обозначает все символы от начала строки до индекса i (не включительно), а s[i:] обозначает все символы от индекса i до конца строки.
В данном случае, строка s подается на вход для каждой возможной позиции в существующей строке. Новая пара скобок "()", добавляется на каждой позиции в строке s (от начала до конца), что приводит к созданию новых комбинаций строк со скобками.
Так, например, на первом цикле при n = 2 и s = '()' срезы будут следующие:
при i = 0: s[:i] = '', s[i:] = '()', итоговая строка: "()" + "()" = "()()"
при i = 1: s[:i] = '(', s[i:] = ')', итоговая строка: "(" + "()" + ")" = "(())"
при i = 2: s[:i] = '()', s[i:] = '', итоговая строка: "()" + "()" = "()()"
Заметьте, что результат может содержать дубликаты, поэтому в конце применяется list(set(result)), чтобы удалить повторяющиеся строки.
В разных итерациях s может принимать различные значения в зависимости от того, какие строки были сгенерированы на предыдущем этапе.
Выражения s[:i] и s[i:] – это срезы строки s. s[:i] обозначает все символы от начала строки до индекса i (не включительно), а s[i:] обозначает все символы от индекса i до конца строки.
В данном случае, строка s подается на вход для каждой возможной позиции в существующей строке. Новая пара скобок "()", добавляется на каждой позиции в строке s (от начала до конца), что приводит к созданию новых комбинаций строк со скобками.
Так, например, на первом цикле при n = 2 и s = '()' срезы будут следующие:
при i = 0: s[:i] = '', s[i:] = '()', итоговая строка: "()" + "()" = "()()"
при i = 1: s[:i] = '(', s[i:] = ')', итоговая строка: "(" + "()" + ")" = "(())"
при i = 2: s[:i] = '()', s[i:] = '', итоговая строка: "()" + "()" = "()()"
Заметьте, что результат может содержать дубликаты, поэтому в конце применяется list(set(result)), чтобы удалить повторяющиеся строки.
Leo Blyum
bruh, спасибо большое<3
Похожие вопросы
- На входе строка s = '3' + n * '5'. В конце сумма её цифр должна быть равна 27. Как преобразовать эту строку в число?
- С клавиатуры вводится число n. Вычислить сумму S=1/1+1/2+1/3+...+1/n.
- Родители Лизы подключили пакет, содержащий N телевизионных каналов, пронумерованных числами от 1 до N
- Python Имеется неупорядоченный массив из n различных целых чисел от 0 до n (0,1,…,j-1,j+1,….,n).
- Задача в питоне!!!!!! Дано целое число n (n находится в диапазоне от 1 до 99), определяющее возраст человека в годах.
- PYTHON! Требуется определить количество способов выплаты n рублей монетами по 1, 2, 5 и 10 рублей.
- Решение задачи по программированию (желательно питон) Сложность O(квадрат(n))
- ЛЮДИ ПОМОГИТЕ У МЕНЯ ЭТОТ КОД НЕ РАБОТАЕТ НУЖНА ПОМОЩЬ ПИТОН ЗАВТРА СДАТЬ НАДО
- Можете подсказать, почему код не работает?
- Помогите написать программу на Python, моя версия кода на скрине, вроде всё работает, но автопроверка не проходит.