Проблема использования этой функции заключается в том, что она увеличивает максимальную возможную длину стека вызовов в интерпретаторе Python, но при этом не меняет, что логично, физический размер стека, выделяемый на процесс операционной системой. Физический размер стека зависит от операционной системы и самого компьютера, он может варьироваться в пределах от 32KiB до 10MiB. Таким образом, если физический размер стека под процесс (установленный на самом компьютере) позволяет, допустим, хранить цепочку из 2200 вызовов, то увеличение стека в Python до 2201 вызовов может привести к переполнению физического размера стека, вследствие чего процесс аварийно завершится. Поэтому можно столкнуться с тем, что на одном компьютере задача решится с помощью расширения глубины стека, но на другом компьютере нет, ибо физические размеры стека у них различны. Мы не знаем, какой компьютер / ноутбук будет на экзамене, потому считать решение посредством setrecursionlimit() универсальным ни в коем случае нельзя, да и тем более задачу можно составить таким образом, что с переполнением стека либо с очень долгим выполнением рекурсии придется столкнуться практически на любой машине.
55:10 есть крч подлость, если в ретерне использовать целочисленное деление вместе с кэшем, то кеш все нормально запомнит и 174 хорошо посчитается return n // 4 + f(n // 4 + 2) if n % 4 == 0 else 1 + f(n + 2) НО если сделать просто n / 4 + f(n / 4 + 2) (деление обычное), то кеш запомнит именно float значения и f(174) - f(3) будет считать заново в тупую( но если их во float перевести то ок всё крч следите за тем, что в кеш сохраняете, иначе бесполезно всё xd
На 51:55 (это, конечно, топорный метод, но его можно использовать для проверки ручных вычислений). Из-за того, что в функции стоят одни плюсы можно ПРЕДПОЛОЖИТЬ, что рано или поздно у нас появится f(3) в цепочке, и просто в самой функции в начале прописать if n == 3: return 0 Т.е. мы просто вызываем f(174) и уже в функции как бы вычитаем f(3) и в итоге получаем результат. Повторюсь, что способ топорный и, я думаю, будет работать не везде
51:56: Я знаю точно: невозможное возможно... from functools import * @cache def f(n): if n >= 10000: return n if n%4 == 0: return n//4 + f(n//4+2) return 1 + f(n+2) for i in range(10002, 1, -1): if i%2 == 0: continue f(i) counter = 0 for i in range(1, 10000): f(i) print(f(174) - f(3))
45:37 такие задачи довольно легко решаются на плюсах, особенно, если юзать Ofast/O3. Насколько я знаю, на экзамене скорее будет MSVC, вроде он даже нормально компилит с O3
10:12 почему-то у меня IDLE завершает программу когда доходит до print(f(5000)/f(4994)), но не выдаёт никакую ошибку, просто ничего не выводит, а на видео за секунду посчитала. В чём моя проблема?
1:37:40 Мне кажется, что комбинаторный тут не совсем подходит. Точнее надо быть более внимательным, его используя, ну или писать прогу. В данном случае нам повезло, что первые 3 разряда оказались единицы. Т.е. никакое другое число, полученное сочетанием единиц, не будет превосходить это, но если нам будет дано, например, 800_000_000, то комбинаторика даст неверный ответ. Хотя зачем я пишу это? Никогда такую задачу не дадут
Здравствуйте,скажите пожалуйста,я правильно понял,что когда в вопросе,к примеру,f(2023)/f(2022),то мы умножаем полученные вызовы,а если f(2023) - f(2022) или f(2023) + f(2022) ,то мы складываем?
Алексей, касаемо заданий на идейную рекурсию. Вы сказали, что на ЕГЭ этого точно не будет, однако свежий сборник Легиона во 2 варианте даёт такую задачу. Это просто хотелка авторов или как?
Все хорошо и понятно объясняешь, лайк однозначно!
Проблема использования этой функции заключается в том, что она увеличивает максимальную возможную длину стека вызовов в интерпретаторе Python, но при этом не меняет, что логично, физический размер стека, выделяемый на процесс операционной системой. Физический размер стека зависит от операционной системы и самого компьютера, он может варьироваться в пределах от 32KiB до 10MiB. Таким образом, если физический размер стека под процесс (установленный на самом компьютере) позволяет, допустим, хранить цепочку из 2200 вызовов, то увеличение стека в Python до 2201 вызовов может привести к переполнению физического размера стека, вследствие чего процесс аварийно завершится. Поэтому можно столкнуться с тем, что на одном компьютере задача решится с помощью расширения глубины стека, но на другом компьютере нет, ибо физические размеры стека у них различны. Мы не знаем, какой компьютер / ноутбук будет на экзамене, потому считать решение посредством setrecursionlimit() универсальным ни в коем случае нельзя, да и тем более задачу можно составить таким образом, что с переполнением стека либо с очень долгим выполнением рекурсии придется столкнуться практически на любой машине.
Поэтому списки наше всё😎🤙
прекрасный стрим. спасибо!
да ладно.... Тупак сдает ЕГЭ по инфе????? Как сдал ?
Алексей, элегантнейшим образом подчеркнул (n).
[Ассоциация перфекционистов одобряет].
1:33:27
55:10 есть крч подлость, если в ретерне использовать целочисленное деление вместе с кэшем, то кеш все нормально запомнит и 174 хорошо посчитается
return n // 4 + f(n // 4 + 2) if n % 4 == 0 else 1 + f(n + 2)
НО если сделать просто n / 4 + f(n / 4 + 2) (деление обычное), то кеш запомнит именно float значения и f(174) - f(3) будет считать заново в тупую( но если их во float перевести то ок всё
крч следите за тем, что в кеш сохраняете, иначе бесполезно всё xd
На 51:55 (это, конечно, топорный метод, но его можно использовать для проверки ручных вычислений). Из-за того, что в функции стоят одни плюсы можно ПРЕДПОЛОЖИТЬ, что рано или поздно у нас появится f(3) в цепочке, и просто в самой функции в начале прописать if n == 3: return 0 Т.е. мы просто вызываем f(174) и уже в функции как бы вычитаем f(3) и в итоге получаем результат. Повторюсь, что способ топорный и, я думаю, будет работать не везде
@kompege а почему from math не использовал? в задаче с факториалом 1:27:30
51:56: Я знаю точно: невозможное возможно...
from functools import *
@cache
def f(n):
if n >= 10000: return n
if n%4 == 0: return n//4 + f(n//4+2)
return 1 + f(n+2)
for i in range(10002, 1, -1):
if i%2 == 0: continue
f(i)
counter = 0
for i in range(1, 10000):
f(i)
print(f(174) - f(3))
Странно, что этот прекрасный гайд посмотрело так мало человек:(
Дядя Сережа ошибся в третьем условии. Там должен быть n*(n-1) + f(n-1) -f(n-2) и тогда ответ из сборника получится
45:37 такие задачи довольно легко решаются на плюсах, особенно, если юзать Ofast/O3. Насколько я знаю, на экзамене скорее будет MSVC, вроде он даже нормально компилит с O3
Совет для 1% людей?
Алексей, спасибо вам за видео! Задание 16, ЕГЭ по информатике, стрим, ЕГЭ, информатика
10:12 почему-то у меня IDLE завершает программу когда доходит до print(f(5000)/f(4994)), но не выдаёт никакую ошибку, просто ничего не выводит, а на видео за секунду посчитала. В чём моя проблема?
Про это можно почитать тут: vk.com/wall-205865487_6122
Выход: смириться с тем что не прокатило и использовать мемоизацию (она точно работает всегда)
@@kompege понял, спасибо
34:55 Зато я смог. На это потребовалось 10 секунд и калькулятор. 2022*2024 + 2020 = 4094548
10 сек это округление?)
У меня мин 2-3 вручную, но решается как и с измененным заданием, все сократилось и так хорошо стало😅
@@katezombie3435Сомневаюсь, я бы не стал просто выпендриваться. А сколько точно не помню, я уже успел семестр в университете отучиться
Время пришло!
1:37:40 Мне кажется, что комбинаторный тут не совсем подходит. Точнее надо быть более внимательным, его используя, ну или писать прогу. В данном случае нам повезло, что первые 3 разряда оказались единицы. Т.е. никакое другое число, полученное сочетанием единиц, не будет превосходить это, но если нам будет дано, например, 800_000_000, то комбинаторика даст неверный ответ.
Хотя зачем я пишу это? Никогда такую задачу не дадут
1:27:04 Дима Статный, что ты сделал
Очень круто
1:23:37 Не понял, почему результат не должен измениться, если поменять 10 000 на 100
тоже этот момент не понял
Алексей, у Вас был уже вебинар по 16. Получается, чтобы изучить данное задание, необходимо и тот вебинар просмотреть и этот?
Да
Здравствуйте,скажите пожалуйста,я правильно понял,что когда в вопросе,к примеру,f(2023)/f(2022),то мы умножаем полученные вызовы,а если f(2023) - f(2022) или f(2023) + f(2022) ,то мы складываем?
Ну не совсем. Умножаем или складываем зависит от описания функции в условии задачи.
@@kompege понял,спасибо.
А это может попасться на основе?
шанс есть, но не такой большой
52:05
можно через один цикл for закэшировать:
for n in range(10000,1,-1):
if n%4==1:
f(n)
я просто все нечетные значение закешировал
for i in range(10000, 0, -1):
if i % 2 == 0: continue
f(i)
print(f(174) - f(3))
@@minegooodd3473 одно и то же в принципе) главное решить
Алексей, касаемо заданий на идейную рекурсию. Вы сказали, что на ЕГЭ этого точно не будет, однако свежий сборник Легиона во 2 варианте даёт такую задачу. Это просто хотелка авторов или как?
Это просто хотелка авторов конкретного сборника
@@kompege Понял, спасибо
Здравствуйте, а 8-ое задание на поиск слов будет? На канале очень мало видео на эту тему
Может быть 10 задание?
Видео на канале по нему есть (смотрите плейлист за 2022 год)
Такая гадость на ЕГЭ выпадала?
Такая гадость в демоверсии )
@@kompege такая гадость в егэ 2023 была прям ща )
@@IDONTKNOW-wn5mxсерьезно?
@@crushitelyoutubaда, но вполне базовая 16 на сетрекуршнлимит
@@crushitelyoutubaно, если разбираешься, то руками за 30 секунд делается в том числе