42 Рекурсия в Python. Рекурсивная функция Часть 2
ฝัง
- เผยแพร่เมื่อ 21 ธ.ค. 2018
- 🔥🔥🔥 Инди-курс по Python 🔥🔥🔥
stepik.org/course/63085/promo
👉👉👉 Свой вопрос по курсу можешь задать в чате
t.me/+SlnNhAO7caBlNDM6
👉👉👉 Также подписывайся на мой телеграмм-канал
t.me/python_egoroff
egoroffartem.pythonanywhere.co...
Функции - это многократно используемые фрагменты программы. При помощи функций можно объединить несколько инструкций в один блок, присвоить этому блоку имя и затем, обращаясь по имени этого блока, выполнить инструкции внутри него в любом месте программы необходимое число раз.
Рекурсия - это когда функция вызывает саму себя.
В видео разберем как при помощи рекурсии можно:
- обработать строку;
- возвести число в целую степень;
- обойти элементы списка произвольной вложенности.
Домашнее задание
На строки
informatics.msk.ru/mod/statem...
informatics.msk.ru/mod/statem...
Нумеролог
acmp.ru/index.asp?main=task&i...
egoroffartem.pythonanywhere.co...
На сайте будет выкладываться более подробная информация о данном курсе и будущих видео.
Все видео этого курса можете найти на сайте
egoroffartem.pythonanywhere.co...
или в Вк
videos-177962775?secti...
Если кому нужна помощь, предлагаю индивидуальные занятия. Подробнее пишите в личку в вк
artem_egoroff
python.study
В данном группе можете найти информацию о новых видео и задать вопросы
Стать спонсором
th-cam.com/channels/McC_43zGHttf9bY-xJOTwA.htmljoin
Стать патроном
www.patreon.com/artem_egorov
Контент не соответствует с просмотрами. Ты достоин лучшего
спасибо, надеюсь в плане просмотров все будет меняться в лучшую сторону)
Согласен)
Это по подписке, поэтому не соответствует
Это лучший плейлист по изучению питона! Столько тем, и при этом каждой уделяется нужное количество времени!) Спасибо)
Взял себе в привычку после просмотра урока на платных курсах, смотреть эту же тему тут, становится гораздо понятнее, спасибо огромное автору!
Остается исключить лишний элемент)
А вот эта логика с обходом многоуровнево-вложенных списков очень крута. Большое спасибо!! Всех благ!
Спасибо за новый урок!
Задача с таймтега 6:00
def f(x):
if len(x)==0:
return x
if x[0]=='(':
return x[0] + f(x[1:]) + ')'
return x[0] + f(x[1:]) + x[0]
x=input()
print(f(x))
не знаю как, но работает)
я тоже много над этим задумался но понял что здесь нужно одно условия которое будет немножко не в тему но и не будет задеть код, не нашел вариантов, увидел твое предложения и подумал что это гениально, хотя думаю что есть решения и попроще
Очень круто объясняете. Спасибо вам
Очень наглядно и понятно, спасибо!
Спасибо за столь простое объяснение непростой темы(для меня).
Благодарю за урок, всё очень доходчиво
Спасибо!!! Всё грамотно и подробно!!! наконец то я всё поняла!!!! ))))
Самый лучший и понятный канал на Ютубе!! Спасибо!
Спасибо, классный курс!
Благодарности нет границ!
Спасибо за видео! Все отлично рассказано.
Ролик понравился, спасибо! Стало чуть понятней в теме 'Рекурсия' :)
Спасибо! Каналу желаю удачи.
Спасибо)
видосик шикарный!!!! СПАСИБО большое
Артём, благодарю! 👍🔥🔥🔥
Все мозги разбил на части, все извилины заплел))))
Забавный случай был с рекурсивной функцией. Я тогда ещё учился в школе, питон знал на приличном уровне. Учитель даёт задание, решает его - получается строк шесть без вызова функции. Я когда сдаю ей решение в одну у неё чуть глаза на лоб не вылезли. Забавно было очень.
Спасибо за столь прекрасное объяснение сложной темы!
Действительно... крайне качественный контент, я ну оооочень долго и много перерыл курсов пока не нашел именно этот, странно, что просмотров нет........... Артем, запили видосы по классам пожалуйста.
Спасибо, видимо ещё не все знают о существовании моего канала
Автор очень круто и понятно изложен материал, с кучей примеров что очень важно обязательно будет донат от меня
Спасибо, хорошо объясняете
Лучшие уроки по питону на Ютубе.
Большое спасибо!!
Чувак конент в кайф! Жги ещё!
Огромное спасибо
Спасибо большое
Очень сложно, но интересно!
Понятно и интересно.
Спасибо!
Так пойдёт вторая задача со скобочками:
stroka = input('enter the string:')
def f(stroka):
if len(stroka) == 0:
return
print(stroka[0],end='')
f(stroka[1:])
if stroka[0] == '(':
print(')',end='')
else:
print(stroka[0],end='')
f(stroka)
Сгодится на ваш взгляд,спасибо
Вот ещё один способ решения задачи на возведение в степень с использованием рекурсии (без проверки на чётность степени). Просто умножаем число на само себя n - 1 количество раз:
def power(x, n):
if n < 0:
return 1 / power(x, -n)
if n == 0:
return 1
return x * power(x, n - 1)
x, n = map(int, input().split())
print(power(x, n))
Но, несомненно, алгоритм, который вы описали в видео, будет работать быстрее, так как будет меньше рекурентных вызовов функции. И чем больше степень, тем ваш алгоритм будет работать быстрее по сравнению с вышеуказанным. Спасибо за отличную подачу материала)
Спасибо, Артем!! Надеюсь, с твоими уроками освою эту сложную тему.
Решение задачи с зеркальными скобками
def rec(s):
if len(s)==0:
return s
if s[len(s)-1]=='(':
s+=')'
if s[len(s)-1].isalpha():
s+=s[len(s)-1]
return s[len(s)-2] + rec(s[0:-2]) + s[len(s)-1]
PS: честно, я почти сдалась, но решение пришло. правильное ли?
Огромное спасибо. Подарок
Хорошая обучалка, хоть рекурсию более менее закрепил, а то применить никак ее не мог
Спасибо большое за уроки! Всё доступным и понятным языком. Узнала много полезного.
Уточните пожалуйста в примере с возведением в степень: power (x,n) через запятую, как программа распознает, что это именно возведение в степень?
Задался этим вопросом и опечалился, когда увидел, что Ваш комментарий без ответа. Поэтому всем, у кого возник этот вопрос: распишите себе весь процесс на бумаге и увидите, что сам интерпретатор не в курсе, что здесь заложена операция возведения в степень, он просто выполняет умножение, согласно прописанным условиям.
Блин, ну доходчиво же. Спс
это гениально
спасибо
Годно, пора продавать на степике итд
Коммент для продвижения канала и безграничная благодарность Вам!
Я что то не совсем понимаю, в задаче из видио когда возводили число в степень, где тот момент когда мы пишем x**n?
Здравствуйте! Отличное объяснение, хотелось бы получить на счёт т.н. хвостатых рекурсий. И ещё как в рекурсии не получая пустой список как аргумент, объявить его чтобы он был объявлен не рекурсивно?
В примере состепенью числа можно было не идти до 0 степени , а остановиться на 1 , так быстрее будет
Отдельное спасибо за практические задания, учил рекурсию по другим лекциям, без практики было не все понятно, сейчас вроде разобрался окончательно
задача 2:
def rec(x):
if len(x)==1:
if x!="(":
return x+x
return "()"
if x[0]!="(":
return x[0]+ rec(x[1:])+x[0]
return "(" + rec(x[1:])+ ")"
x=input()
print(rec(x))
Добрый день, Артём. Не совсем поняла решение задачи по возведению в степень.
Стараюсь перед вашим объяснением порешать сама и у меня получился вот такой вариант:
def power(x,n):
if n==1:
return x
if n==0:
return 1
if n
1 задача про зеркальность:
def rec(s):
if len(s) == 1:
return s + s
return s[0] + rec(s[1:]) + s[0]
2 задача про нумерологию:
def rec(x, n = 0):
if len(str(x)) == 1:
return x, n
return rec(sum(list(map(int, str(x).strip()))), n + 1)
x = int(input())
print(*rec(x))
начинаю лучше разбираться в рекурсиях, тема тяжеловатая
🫵 Теория без практики - ничто, поэтому 👇
🐍 stepik.org/course/63085/promo
👉 специально для тебя создал бесплатный топовый курс по Python
👉 В нем тебя ждет:
📗 более 400 практических заданий на программирование
📗 более 250 тестовых заданий на проверку материала
📗 десятки часов видеоматерилов по теории
📗 видеоразборы решения заданий
📗 текстовые материалы по урокам, примеры кода
📗 доступ к закрытому чату с дружественной обстановкой
📗 сертификат в случае успешного прохождения курса
Нумеролог
x = int(input())
def f(x, y=0):
if x
в первом задании если с внешними скобочками, то вот так можно сделать:
def brackets(s):
if len(s)
Отличные уроки!
Хорошо бы видео разбор по задачам этой темы сделали бы :-)
вроде все понимаешь и думаешь как все просто ,а начинаешь делать задания и все ж..а( на пару дней застреваешь. Самому не всегда получается придумать решение, и начинаешь искать в инете по теме.
подскажите пожалуйста где ошибка? не принимает на 4 тесте
b=input()
def rec(b, lvl = 0, s = 0):
if len(str(b)) == 1:
return b + ' ' + str(lvl)
else:
s+= sum(list(map(int, str(b))))
lvl += int((len(str(b)))-1)
b = sum(list(map(int, str(b))))
return rec(str(b), lvl)
print(rec(b))
Подскажите, пожалуйста, как решается задача А (прибавить 3, прибавить 5)?
Нумеролог
c=0
def q(a):
global c
if a
лучшее решение, так и не смог к нему прийти
чуть лучше наверное так, как Артем показывал с уровнями, чтоб без глобальных переменных, а в целом действительно лучшее решение на чистой рекурсии:
def q(a, c = 0):
if a
молодец
Здравствуйте! Объясните пожалуйста как решается задача "Нумеролог"
нумеролог
def recursive_sum(n, s=0):
return s + n if n < 10 else recursive_sum(n // 10, s + n % 10)
def numerolog(n, level=0):
print(n, level) if n < 10 else numerolog(recursive_sum(n), level+1)
можно и через встроенный sum, но решила использовать рекурсию по максимуму вместо итерации)
Задача: Нумеролог. Я старался применить и рекурсию с вложенные функции. Спасибо автор!!!
def asum(a):
b = 0
for i in str(a):
b += int(i)
return b
def text(a, count=0):
if a < 10:
return f'{a} {count}'
return text(asum(a), count + 1)
print(text(int(input())))
применил цикл for, а значит уже не чистая рекурсия )
@@user-xi9hi4tf4j а как по другому решить то?
@heybeachMIN ну я так решил, чуть проще, без циклов. Видел в другом комменте у вас такое же решение было.
def q(a, c = 0):
if a
@@user-xi9hi4tf4j да я потом сам подумал и нашел решение) но сначало казалось что без for никак ) спасибо за Ваше решение
def num(x,ch1=0):
if x
Нумеролог:
def st(x, c=0):
return (x, c) if x < 10 else st(sum([int(i) for i in str(x)]), c+1)
цикл for остался ) а значит это не рекурсия
если хочется максимально коротко и с рекурсией то лучше уже такое
def text(a, count=0):
return f'{a} {count}' if a < 10 else text(a // 10 + a % 10, count + 1)
можете подсказать как распаковать несколько уровневый список без циклов через рекурсию, пожалуйста (
Артем, как ты думаешь это оптимальное решение или можно лучше? :
def numerolog(s,count=0):
if len(s) == 1:
return s,count
return numerolog(s=str(sum([int(i) for i in s])), count=count+1)
print(numerolog(input()))
нормальное)
Вот мой вариант решения задачи с тайм кода 10:10
def zadacha3(n, count=0):
if len(str(n)) == 1:
return n, count
return zadacha3(n = sum((int(i) for i in list(str(n)))), count=count+1)
print(zadacha3(99))
Вывод: (9, 2)
Строка где возвращается рекурсия скорее всего тяжело читается, но сделал как сделал, главное что работает
Артем, спасибо большое за уроки.
Подскажи, плз., для чего использовался 'pass' ? Какова его функция?
такие конструкции как if while for def должны содержать в себе блок команд на отступах после двоеточия. Этот блок не может быть пустым, то есть обязан состоять хотя бы из одной строчки. Иногда нужно оставить блок пустым(без каких либо действий), и вот для этого нужен pass. pass - пустой блок
@@egoroffchannel Большое спасибо.
zada4a numerolog:
n = input()
c = 0
def f(n):
global c
if (len(n) == 1):
return n
c+=1
return f(str(sum(map(int, list(n)))))
print(f(n), c)
пришлось поломать голову.. спасибо огромное за этот видеокурс. очень очень полезный и понятный!!
задание 2:
def mirror(line, new_line=""):
if len(line)
можно было гораздо проще:
s=input()
def rec(s):
if len(s) == 0:
return s
return s[0] + rec(s[1:]) + s[0].replace('(', ')')
print(rec(s))
Вроде задачи не очень сложные для понимания того, как их решить, но как это записать в код - это уже проблема. Как эффективно тренироваться в этом плане ?
задача на текст + зеркальное отображение без спец.методов пайтона(у многих только "зеркало" возвращало):
def concat_revers(txt):
if txt[0] == '(':
mirror_sym = ')'
elif txt[0] == ')':
mirror_sym = '('
else:
mirror_sym = txt[0]
if len(txt) == 1:
return txt+mirror_sym
else:
return f'{txt[0]}{concat_revers(txt[1:])}{mirror_sym}'
Решения задач со строками:
1. Звездочки
def rec_stars(s):
if len(s) == 1:
return s
else:
return s[0] + '*' + rec_stars(s[1:])
2. Отзеркалить строку и развернуть кавычки
def rec_mirror(s):
if len(s) == 1:
return s if s != '(' else ')'
else:
return s[-1] + rec_mirror(s[:-1]) if s[-1] != '(' else ')' + rec_mirror(s[:-1])
там не просто отзеркалить надо, а сконкатенировать с входной строкой )
Ура , работает:
def rec(str):
if len(str)==1 or len(str)==2 or '(' not in str:
return str
return str[0:str.index('(')] + '(' + rec(str[str.index('(') + 1:]) + ')' + str[0:str.find('(')[::-1]
задача про скобки:
def rec(a: str):
if len(a)
На ответ со скобками я сделал так:
def copyrit(s):
if len(s)
вот так решил вторую задачу со скобочками
def rev(s):
if len(s) == 0:
return s
else:
if s[0] == '(':
return s[0] + rev(s[1:]) + ')'
return s[0] + rev(s[1:]) + s[0]
Нашел более короткое решение задачи со степенью:
def recursivepower(x,n):
if n == 1:
return x
if n == 0:
return 1
return x * power(x,n-1)
Спасибо за изумительный курс. Не понимаю в первом примере, какую s в итоге мы возвращаем, из 3й строки или 4й . Если len(s) = 1, то s которая возвращается следующей строкой состоит всего из одного символа.
S с длиной 1 или 2 возвращается из 3-й строки, таким образом завершается работа функции, иначе бы рекурсия стала бесконечной.
Почему в данном случае не выводится None, когда мы не используем return?
#добавить зеркальную строку
def skobka(y):
if y == '(':
return ')'
return y
def mirror(s):
if len(s) < 2:
return skobka(s)
return mirror(s[1:]) + skobka(s[0])
s = input()
print(mirror(s))
по заданию нужна была исходная + зеркальная )
ох как же я подвис на рекурсии с возведением в степень... помог отладчик в visualstudio, хоть он и не особо информативный
вот ответ
ask = input()
askl = len(ask)
nf = 1
def ft (x):
global nf
if nf < askl:
aqwe = (ask[nf]+'*')
nf = nf+1
print(aqwe, end='')
ft(x)
ft(ask)
def mirror(s):
return s + s[::-1].replace('(', ')')
вроде работает :)
def life(x, count=0):
x = eval('+'.join([i for i in str(x)]))
if len(str(x)) == 1:
return x, count+1
return life(x, count+1)
уже близко, но не правильно
У меня получилось вот такое решение последней задачи
def guy(s, n = 0):
k = 0
if s//10 == 0:
return s, n
else:
l = str(s)
for i in range(len(l)):
k += int(l[i])
s = k
return guy(s, n+1)
print(guy(int(input())))
4:10 почему начальная буква берется с индексом 0 и в рекурсии мы берём индекс 1 а конечная что в возврате -1 что в рекурсии -1. Не должно ли -2 быть в срезе?
Вы проделали, конечно, большую работу и спасибо Вам за это. Но, как все это запомнить.. м. б. есть какие то методы? С первого раза запоминается очень обобщённо.
С помощью практики на моем бесплатном курсе
stepik.org/course/63085/promo
Подскажите, в этой строчке: return power(x, n//2) * power(x, n//2) - как так получается, что один аргумент - это степень, а другой - это число, почему одно возводится в другое, где инструкция чтобы икс возводился в степень n?
мы сами определяем кто степень, а кто число
@@egoroffchannel окей, с этим ответом мне жить)
ДЗ, не знаю куда нужно было скидывать, кидаю и сюда тоже
Нумеролог:
with open ('INPUT.TXT') - as inf:
number=inf.radline()
count=0
def numerolog(number,count):
summa=0
if number
Артем, здравствуйте. Никак не могу разобраться почему решение схожей задачи на вашем курсе на степике( преобразование списка с вложенными списками в линейный)
не принимает система.
Мое решение
уточняю, идет о последней задаче в главе 7.7 Рекурсия в Python. Рекурсивная функция Часть 1)
и как посмотреть решение?
@@egoroffchannel очень странно, что его стало не видно6 видно плагин к сафари с темной темой не корректно сработал. flat = []
def flatten(lst):
for i in lst:
if type(i) == int:
flat.append(i)
if type(i) == list:
flatten(i)
return(flat)
def numerolog2(n, count2=0):
n = sum([int(i) for i in list(str(n))])
if len(str(n)) > 1:
return numerolog2(n, count2+1)
return n, count2+1
5.47 где вторая задачка сделал без рекурсии
def func(s):
s_reversed = (''.join(_.replace('(', ')') for _ in s[::-1]))
return s + s_reversed
s=input()
print(func(s))
С рекурсией сам не смог, взял решение снизу (аплодирую автору сам не додумался такой пирамидкой сделать) и укоротил код немного
def rec(x):
if len(x)==1:
return x+x if x != '(' else x+')'
return x[0] + rec(x[1:])+x[0] if x[0] != '(' else x[0] + rec(x[1:]) + ')'
x=input()
print(rec(x))
у меня курсив стал другим он как бы не может изменить значение в середине приходится удалять всю строку
Задачка №3
Сайт решение принял, но я не понял, как в функцию запихать саму строку.
У меня выводит только "отзеракаленную" копию.
Пришлось в принт запихать конкатенацию изначальной строки и ее копии
Комрады, подскажите, может кто изящнее решил?
def rec(s):
if len(s) == 0: # Выход из рекурсии
return s
# Отщипываем первый символ и плюсуем его же
return rec(s[1:]) + s[0].replace('(', ')')
s = input()
print(s+rec(s))
def power(x,n)
вопрос - почему n идёт как степень числа x исходя из этой записи?
К примеру есть функция pow, которая импортируется из math - там аргументы передаются как раз таким образом, но это ведь 2 разные функции - в одном случае та что мы сами пытаемся сделать, а во втором готовая встроенная
Можно параметры функции располагать в любом порядке, значит функцию можно было определить как def power(n,x)
Затем, какой параметр является числом, а какой степенью определяешь только ты сам, но после того как определил и вызывать тогда ты должен соответствующе и одинаково всегда
И еще, эти параметры можно называть как хочешь, например def power(chislo,stepen) и вот тогда уже точно будет понятно, кто есть кто
@@egoroffchannel спасибо за ответ) саму физику процесса еще не понял, например в этой строчке: return funk(x, n//2) * funk(x, n//2) - как так получается, что один аргумент - это степень, а другой - это число, почему одно возводится в другое, где инструкция чтобы икс возводился в степень n?
Напишите рекурсивную функцию remove_v, удаляющую из строки все буквы «v» и возвращающую результирующую строку.
вот с номерами помучился, но:
count = 0
def numerolog2(*a):
try:
n = list(a[0])
except TypeError:
n = [a[0], 0]
if n[0] // 10 == 0:
return n
if n[0] // 10 != 0:
counter()
return [numerolog2([(n[0] % 10) + numerolog2([n[0] // 10, n[1]])[0], n[1]])[0] , count]
def counter():
global count
count += 1;
Нумеролог:
n=input()
def numerolog(n,count=1,summ=0):
if len(str(n))==1:
return int(n),0
for i in (str(n)):
summ+=int(i)
if len(str(summ))!=1:
return numerolog(summ,count+1,0)
return summ,count
print(*numerolog(n))
Решение задачи "Нумеролог"
a = int(input())
def rec(x, counter=0):
s = 0
if x < 10:
return x, counter
for i in str(x):
s += int(i)
counter += 1
if s > 9:
return rec(s, counter == 1)
return s, counter
print(*rec(a))
я так понял смысл рекурсии - уйти от циклов, а у Вас вышла рекурсия с циклом ))) ... хотя у меня и это не получилось.
Вот, все что смог, сумма цифр считается, но не пойму как в рекурсию счетчик засунуть (чтоб без цикла). Если кто подскажет, буду благодарен
def numerolog(n:int):
if n
@@yevhenbaklahov193 count += len(str(number)) - 1
Брррр, чёто я сломал себе мозг со 2й задачей на 2 часа (рекурсия это что-то :-) )
def Mirracle(a):
if len(a) == 1:
if a == '(':
return '()'
return a + a
if a[0] == '(':
return a[0] + Mirracle(a[1:]) + ')'
else:
return a[0] + Mirracle(a[1:]) + a[0]
a = 'abc(def(g'
print(Mirracle(a))