Теория игр, рекурсия, поиск нужных значений
При попытке запустить код возникает бесконечная рекурсия (не может найти подходящие значения под условия, да и сам код неверный из-за s==42) - что изменить в коде, чтобы он действительно работал и при других заданиях (кроме 19)?
Два игрока, Петя и Ваня, играют в следующую игру.
Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может увеличить количество камней в куче на 1, 3 или 7. Игра завершается в тот момент, когда количество камней в куче становится ровно 42. Игрок, первым получивший кучу из 42 камней, считается победителем. Игрок получивший после своего хода более 42 камней считается проигравшим и победителю засчитывается ход в 42. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
- Укажите такое минимальное значение s, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим #Ответ: 38 первым ходом.
- Найдите два наименьших значения s, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
— Петя не может выиграть за один ход;
— Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня. Найденные значения запишите в ответе в порядке возрастания. #Ответ: 31, 33
- Найдите два наименьших значение s, при котором одновременно выполняются два условия:
— у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети; — у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом. Найденные значения запишите в ответе в порядке возрастания #Ответ: 30, 32
def f(s,p):
if s == 42 and p == 3: return True
#if s > 42 and p == 3: return False
if s == 42 and p < 3: return False
if s == 42 and p == 3: return False
if p%2 == 0:
return f(s+1,p+1) and f(s+3,p+1) and f(s+7,p+1)
if p%2 != 0:
return f(s+1,p+1) or f(s+3,p+1) or f(s+7,p+1)
for s in range(1,60):
if f(s,1):
print(s)