Ошибка превышения максимальной глубины рекурсии

Вот сами задания

19 Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в два раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда количество камней в куче становится не менее 301. Победителем считается игрок, сделавший последний ход, т.е. первым получивший кучу из 301 или больше камней.

В начальный момент в куче было S камней, 1 <= S <= 300

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

Укажите такое значение S , при котором Петя не может выиграть за один ход, но при любом ход Пети Ваня может выиграть своим первым ходом.

20 Для игры, описанной в задании 19, найдите два наименьших значения S , при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия: — Петя не может выиграть за один ход; — Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.

Найденные значения запишите в ответе в порядке возрастания.

21

Для игры, описанной в задании 19, найдите минимальное значение S, при котором одновременно выполняются два условия: — у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети; — у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Был написан такой код, но вылазит ошибка

from functools import lru_cache
def moves(h):
    return h + 1, h * 2
@lru_cache(None)
def game(h):
    if h >= 301: return 'W'
    if any(game(m) == 'W' for m in moves(h)): return 'P1'
    if all(game(m) == 'P1' for m in moves(h)): return 'B1'
    if any(game(m) == 'B1' for m in moves(h)): return 'P2'
    if all(game(m) == 'P1' or game(m) == 'P2' for m in moves(h)): return 'B2'
for s in range(1, 300):
    if game(s) == 'P1':
        print(s, game(s))

Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Перед основным циклом заполните кэш:

...
for s in range(1, 300)[::-1]:
    game(s)
...
→ Ссылка