Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
 Аватар для Nik Golor
3 / 3 / 0
Регистрация: 07.01.2017
Сообщений: 101

Рекурсия. Рекурсия с мемоизацией.

08.06.2019, 09:48. Показов 6341. Ответов 62
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Задача такова: У нас есть массив для длины строки (пусть будет M=20). У нас есть некие длины слов (колличество не важно пусть будет 50 слов, задаим длины, как значение "j", ну а сами слова пусть будут "i"). Смысл в том, что заполнить словами строки + с учетом пробела + еще штрафы (штрафы - место оставшееся в строке куда не влезло слово и перенесли на след. строку). С этим всё более менее понятно. Но вот тут, момент который мне не понятен следкует. Дойдя до последней строчки, мы получим последний штраф, как мне сказали, его для рекурсии, нужно возвести в куб (^3 для большей наглядности) и пустить на подсчет выше по строкам, мол далее он сам всё сделает, все подсчеты "нужно довериться". Я НЕ ПОНИМАЮ! Как это и зачем, и как это сделать! Говорили, что нужно два цикла, один (внешний) на подсчет всех слов зачем-то, а второй (внутренний) , как я понял должен выполнять (что-то) и условие на пока не >0. Это рекурсия. И я не привык к такому ужасу, не могу понять. Помогите пожалста, а то уже голову сломал. Главное с рекурсией разобраться, а мемоизация, как я понял - это тоже самое, только с сохранением значений пройденный путей.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.06.2019, 09:48
Ответы с готовыми решениями:

Рекурсия. Рекурсия с мемоизацией. (полная версия в печатном варианте, работа со словами и строками)
Прошу помочь, может было у кого похожее задание, пока выгружу и продолжу выполнять. Буду благодарен любой помощи. Входной текст состоит...

Рекурсия
Подскажите как здесь можно использовать рекурсию.import math print("Введіть x: ") x = float(input()) print("Введіть y:...

Рекурсия
Добрый день! Есть код: x = v = ] def isParrent(a,b,l1,l2): ret = '' if b in l1: if a in l2: ...

62
 Аватар для Nik Golor
3 / 3 / 0
Регистрация: 07.01.2017
Сообщений: 101
13.06.2019, 21:10  [ТС]
Студворк — интернет-сервис помощи студентам
0x10, посмотрите, критекуйте, я правильно понял идею первого пункта? это так должно выглядеть?
Python
1
2
thislist = ["VODA", "SENO", "KUMULAZ", "JUNGLE", "SAKITOR", "BABILAN", "SINHROFAZOTRON", "BELUGA", "PIKABU"]
thislist.split([ ], [20]);
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
13.06.2019, 21:12
Цитата Сообщение от Nik Golor Посмотреть сообщение
я правильно понял идею первого пункта? это так должно выглядеть?
Я ожидал другого.
У вас есть список слов. Ок. Теперь нужно сформировать список длин этих слов.
0
 Аватар для Nik Golor
3 / 3 / 0
Регистрация: 07.01.2017
Сообщений: 101
13.06.2019, 21:30  [ТС]
0x10, сорри, я затупил, есть похожая вещь в java просто. как я понял вы имели в виду
Разбиение строки Split

Метод split() в Python без аргумента разбивается на пробелы.

Пример:
Python
1
2
3
4
str = "This is a test"
print(str.split())
str = "This is a test"
print(str.split())
Вывод:
Python
Python
1
['This', 'is', 'a', 'test']
Добавлено через 4 минуты
Разделить строку в список

Следующая программа Python разделяет строку на список.

Пример:


Python
1
2
3
4
str = "This is a test"
lst = str.split()
for st in lst:
print(st)
Вывод:
Python
Python
1
2
3
4
This
is
a
test
Добавлено через 3 минуты
получается ислользуя Разбиение строки Split мы заменяем str(строку) на наше thislist и тем самым проводим разбиение нашей строки на эллементы (слова), а потом делаем их подсчет. как понял так работает..?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.06.2019, 21:40
0x10, Nik Golor, я прочёл условие и почувствовал себя тупым. То есть, я и близко не понимаю о чём речь. Я не могу себе представить ни одного варианта разбиения кроме первого и единственного.
Цитата Сообщение от Nik Golor Посмотреть сообщение
Входной текст состоит из слов с известными длинами (количеством символов) I1,I2, ..., In и представляет
абзац. Его нужно "правильно отформировать" и вывести в несколько сток длинной M символов (M>=max Ii).
Форматирование заключается в следующем. Если в строке размещаются слова с i-го по j-е, то между ними
вставляется по одному пробелу и вычисляется остаток M j+i-(Ii+...Ij), который должен быть неотрецательным.
Нужно минимизировать сумму кубов остатков по всем строкам, кроме последней.
Ввод: Первая строка входного файла содержит число слов n и длину строки M. Вторая строка содержит
длины I[1],I[2],...,I[n].
То есть, если мне задана строка (последовательность слов неизменна) и размер строки абзаца M, то я могу лишь представить последовательное заполнение. Я заполняю первую строку M1 из будущей матрицы MХN, словами идущими сначала строки I (+пробел) до тех пор, пока за последним словом не окажется места или +1 пробел +следующее слово не поместится. С него начнётся следующая строка. И так до опустошения строки I.
Я понимаю, что в задаче имеется ввиду нечто иное. Возможно М это максимальная длина строки абзаца, а нам нужно найти оптимальную 0<m<M ? Или скажем создать матрицу символов с минимальной диагональю?
0
 Аватар для Nik Golor
3 / 3 / 0
Регистрация: 07.01.2017
Сообщений: 101
13.06.2019, 21:49  [ТС]
IGPIGP, ну да вообще, должна быть строго говоря строка. да даётся длинна и надо заполнять каждую строку с учетом пробела и штраф еще приплетать. + к этому, как вы упомянули про последнее слово и слово вне размерности строки. Что-то я уже сам запутался если честно.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.06.2019, 21:51
Цитата Сообщение от Nik Golor Посмотреть сообщение
Что-то я уже сам запутался если честно.
Чтобы в конце распутаться нужно сначала запутаться. Иначе получится наоборот.
0
 Аватар для Nik Golor
3 / 3 / 0
Регистрация: 07.01.2017
Сообщений: 101
13.06.2019, 22:44  [ТС]
IGPIGP, щас стараюсь по тихоньку идти пошагово. Надеюсь, что-то путное выйдет, как отчаюсь сразу сюла выкину.

Добавлено через 42 минуты
IGPIGP, Вы еще не спите? Гляньте плз, если что не так скажите. Вы такое имели в виду?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
M=20 #длина строки
thislist = ["VODA", "SENO", "KUMULAZ", "JUNGLE", "SAKITOR", "BABILAN", "SINHROFAZOTRON", "BELUGA", "PIKABU"]
len(thislist) #колличество эллементов
def FullOst(i):
    if i == 0: #номер слова
        return (M - l[i])**3
    else:
        OstSTR = M - FullOst[i]
        costs = FullOst(i-1) + OstSTR**3
        while OstSTR >= 0 and i > 0:
            if (OstSTR - FullOst[i-1] - 1) > 0:
                OstSTR = (OstSTR - FullOst[i-1] - 1)
               costs = min(costs, OstSTR**3 + FullOst(i - 1))
        return costs
print(f(2))
0
13.06.2019, 23:21

Не по теме:

Цитата Сообщение от Nik Golor Посмотреть сообщение
IGPIGP, Вы еще не спите?
Уже почти. Я ещё далеко от решения. Только успел почитать по ссылке 0x10, описание задачи и понял, что "наивный" способ распределения, называемый решёточное (greedly) разбиение, оказывается не самый удачный с точки зрения минимизации штрафов. Может завтра посмотрю реализацию алгоритма. Она там не рекурсивная, а выполнена в двойном цикле.

0
 Аватар для Nik Golor
3 / 3 / 0
Регистрация: 07.01.2017
Сообщений: 101
14.06.2019, 07:04  [ТС]
IGPIGP, Да, там немного не понятно местами. Примерно предстваляю, как должно выглядеть, но как туда еще использовать 2цикла (наверное сложенный делать или хз даже), +умудриться применить рек. и мемоизацию.
0
 Аватар для Nik Golor
3 / 3 / 0
Регистрация: 07.01.2017
Сообщений: 101
14.06.2019, 08:33  [ТС]
роспись
Миниатюры
Рекурсия. Рекурсия с мемоизацией.   Рекурсия. Рекурсия с мемоизацией.   Рекурсия. Рекурсия с мемоизацией.  

Рекурсия. Рекурсия с мемоизацией.   Рекурсия. Рекурсия с мемоизацией.   Рекурсия. Рекурсия с мемоизацией.  

0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
15.06.2019, 09:16
Цитата Сообщение от IGPIGP Посмотреть сообщение
Только успел почитать по ссылке 0x10, описание задачи и понял, что "наивный" способ распределения, называемый решёточное (greedly) разбиение, оказывается не самый удачный с точки зрения минимизации штрафов.
Не «решетка» (grid), а жадный (greedy). См. Жадный алгоритм (wiki).

Цитата Сообщение от IGPIGP Посмотреть сообщение
Возможно М это максимальная длина строки абзаца, а нам нужно найти оптимальную 0<m<M ?
Конечная цель — для каждой строки получить пару (i; j), означающую, что в этой строке располагаются слова с i по j. Я же не просто так несколько постов назад предложил взять простой короткий пример, вручную перебрать все возможные решения, посчитать штрафы и выбрать оптимальное.

Еще раз, входные данные небольшого примера: длина строки 10, текст «aaaaaaa bb cccccc ddddd».
Варианты форматирования с вычисленными штрафами:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1···5···10
aaaaaaa bb     =    0
cccccc····  4³ =   64 
ddddd·····     =    0
               =   64
 
aaaaaaa···  3³ =    9
bb cccccc·  1³ =    1
ddddd·····     =    0
               =   10
 
aaaaaaa···  3³ =    9
bb········  8³ =  512
cccccc····  4³ =   64
ddddd·····     =    0
               =  576
Здесь чуть забежал вперед и предположил, что за последнюю строку штраф не начисляется.

Цитата Сообщение от Nik Golor Посмотреть сообщение
Python
1
2
3
M=20 #длина строки
thislist = ["VODA", "SENO", "KUMULAZ", "JUNGLE", "SAKITOR", "BABILAN", "SINHROFAZOTRON", "BELUGA", "PIKABU"]
len(thislist) #колличество эллементов
В чем смысл третьей строки? Вычислили количество элементов, бросили на пол.
Цитата Сообщение от 0x10 Посмотреть сообщение
1. Входные данные. Для наглядности пусть исходными данными будет текст. Текст легко разделить на список слов, метод split в помощь. Далее по списку слов легко сформировать список длин этих слов.
Python
1
2
3
4
5
6
text = """
aaaaaaa bb cccccc ddddd
"""
 
words = text.split()
words_lens = [len(word) for word in words]
Цитата Сообщение от 0x10 Посмотреть сообщение
2. Создадим матрицу штрафов. Только назовем ее не ff, а costs, чтобы потом не вспоминать.
Где оно?
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
15.06.2019, 09:47
Цитата Сообщение от 0x10 Посмотреть сообщение
Не «решетка» (grid), а жадный (greedy). См. Жадный алгоритм (wiki).
Спасибо, мой англ. меня подвёл, выходит. Интересно, что по смыслу, это не столь жадный, сколько наивный (прямолинейный/незамысловатый/бесхитростный) алгоритм. То есть, англосаксы считают жадность, наиболее естественной манерой поведения? ( шучу, конечно ).
Цитата Сообщение от 0x10 Посмотреть сообщение
Конечная цель
Я посмотрел по данной вами ссылке в ветке С++ для новичков и понял-таки о чём там речь. А вот далее текст перевёлся плохо. Алгоритм из книги Кормена, в книге "Кормен Т., Лейзер Ч. Алгоритмы. Построение и анализ" я не нашёл. Но подумать об этой теме оказалось интересно.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
15.06.2019, 10:23
Наконец-то привели пример ввода/вывода.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
t = 'Это было интересное время Именно в такие почему то любят отправлять своих героев многочисленные авторы пишущие в жанре АИ забывая при этом как о древнем китайском проклятии так и о том что даже просто уцелеть для чужака не имеющего ни родных ни просто знакомых незнающего языка и обычаев чужой страны задача практически нереальная А уж если возникла мысль закинуть в прошлое женщину да еще в интересное время Но все же Это было интересное время Начало распада великой империи и рождение сразу двух новых одной из них даже предстоит намного пережить своего создателя Вот в этот то уже давно бурлящий но еще не плеснувший через край котел упала буквально с неба еще одна человеческая жизнь Каплей чтобы исчезнуть бесследно крупинкой ли соли чтобы растворится оставив после себя память камнем на самое дно наблюдать отстраненно за крушением миропорядка или щепкой в водовороте событий а может и пулей насквозь Так ли это важно Как жить и где умирать каждый выбирает сам а решает судьба'
 
M = 30
 
words = t.split(' ')
lens = [len(i) for i in words]
 
r = [[]]
for l in lens:
    line = r[-1]
    if sum(line) + len(line) + l <= M:
        line.append(l)
    else:
        r.append([l])
 
i = 0
for line in r:
    for _ in line:
        print(words[i], end=' ')
        i += 1
    l = M - (sum(line) + len(line) - 1)
    print(' ' * l, end='')
    print(l ** 3)
Code
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
Это было интересное время      125
Именно в такие почему то любят 0
отправлять своих героев        343
многочисленные авторы пишущие  1
в жанре АИ забывая при этом    27
как о древнем китайском        343
проклятии так и о том что даже 0
просто уцелеть для чужака не   8
имеющего ни родных ни просто   8
знакомых незнающего языка и    27
обычаев чужой страны задача    27
практически нереальная А уж    27
если возникла мысль закинуть в 0
прошлое женщину да еще в       216
интересное время Но все же Это 0
было интересное время Начало   8
распада великой империи и      125
рождение сразу двух новых      125
одной из них даже предстоит    27
намного пережить своего        343
создателя Вот в этот то уже    27
давно бурлящий но еще не       216
плеснувший через край котел    27
упала буквально с неба еще     64
одна человеческая жизнь Каплей 0
чтобы исчезнуть бесследно      125
крупинкой ли соли чтобы        343
растворится оставив после себя 0
память камнем на самое дно     64
наблюдать отстраненно за       216
крушением миропорядка или      125
щепкой в водовороте событий а  1
может и пулей насквозь Так ли  1
это важно Как жить и где       216
умирать каждый выбирает сам а  1
решает судьба                  4913
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
15.06.2019, 10:29
Рыжий Лис, такой алгоритм на моем примере дает неоптимальное решение.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
15.06.2019, 10:30
Знаю.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.06.2019, 01:04
Рыжий Лис, вы считаете штрафы не учитывая одиночные пробелы между словами?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
16.06.2019, 07:40
Ага. Вот со всем пробелами:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
t = 'Это было интересное время Именно в такие почему то любят отправлять своих героев многочисленные авторы пишущие в жанре АИ забывая при этом как о древнем китайском проклятии так и о том что даже просто уцелеть для чужака не имеющего ни родных ни просто знакомых незнающего языка и обычаев чужой страны задача практически нереальная А уж если возникла мысль закинуть в прошлое женщину да еще в интересное время Но все же Это было интересное время Начало распада великой империи и рождение сразу двух новых одной из них даже предстоит намного пережить своего создателя Вот в этот то уже давно бурлящий но еще не плеснувший через край котел упала буквально с неба еще одна человеческая жизнь Каплей чтобы исчезнуть бесследно крупинкой ли соли чтобы растворится оставив после себя память камнем на самое дно наблюдать отстраненно за крушением миропорядка или щепкой в водовороте событий а может и пулей насквозь Так ли это важно Как жить и где умирать каждый выбирает сам а решает судьба'
 
M = 30
 
words = t.split(' ')
lens = [len(i) for i in words]
 
r = [[]]
for l in lens:
    line = r[-1]
    if sum(line) + len(line) + l <= M:
        line.append(l)
    else:
        r.append([l])
 
i = 0
for line in r:
    for _ in line:
        print(words[i], end=' ')
        i += 1
    print(' ' * (M - (sum(line) + len(line) - 1)), end='')
    l = M - sum(line)
    print(l ** 3)
Code
1
2
3
4
5
6
Это было интересное время      512
Именно в такие почему то любят 125
отправлять своих героев        729
многочисленные авторы пишущие  27
в жанре АИ забывая при этом    512
как о древнем китайском        1000
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
16.06.2019, 07:48
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Вот со всем пробелами:
А смысл?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
16.06.2019, 07:50
Не знаю. IGPIGP заметил, что я выполнил задание не совсем точно, вот я и подправил.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
16.06.2019, 08:00
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
выполнил задание не совсем точно, вот я и подправил.
В первой версии штраф вычислялся верно. Нет смысла считать все пробелы, нам нужно получить как можно более «аккуратный» правый край. Если слова заполняют строку до конца, то штраф должен быть 0. Не готов сейчас привести контрпример, на котором это стрельнет.

А задание выполнено неточно, потому что по условию требуется алгоритм, находящий оптимальное распределение, а у вас жадный алгоритм, не всегда дающий оптимальное решение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.06.2019, 08:00

Рекурсия
Исполнитель НечетМ преобразует число на экране. У исполнителя НечетМ две команды, которым присвоены номера: 1. прибавь 1 2. сделай...

Рекурсия
def ent(t, i=0): if i &lt; 5: return linear(t, i + 1) for j in t: if type(j) == list: w = 0 ...

Рекурсия
. Описать рекурсивную функцию FibRec(N) целого типа, вычисляющую N-е число Фибоначчи F(N) по формуле F(1)= F(2) =1, F(k) = F(k-2) +...

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

Рекурсия не работает
Всем привет, есть такой код: n = {'None': 'global', 'global': 'foo'} variable = {'global': 'a', 'foo': 'b'} def get(namespace,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Remote Connection Manager
DevAlt 21.06.2026
Написал для себя небольшую прилагу: https:/ / github. com/ altbodhi/ ReConMan По итогу пришел к мысли, что DU не дружат с существующими технологиями. От сериализации до отображения в реляционную. . .
Администрация Хабра удаляет новые алгоритмы, которые не западно ориентированной философии кода, без уведомлений и объяснений.
Hrethgir 20.06.2026
Делается это, как замечено, при правках - при объявлении концептуальных отличий в алгоримах. Делается это, по линейке событий - после дополнения публикации основными отличиями от основных западных. . .
Процесс ориентированная диалектика (не новость - просто системное обновление, философия).
Hrethgir 20.06.2026
Однажды один участник в своём блоге, на этом форуме, сделал запись "О языках замолвите слово". Понимая, что язык - важная вещь, я решил хорошо подумать, прежде чем сказать, и сказал то, что вы видите. . .
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru