Теория игр, рекурсия, поиск нужных значений

Рейтинг: -1Ответов: 2Опубликовано: 27.03.2023

При попытке запустить код возникает бесконечная рекурсия (не может найти подходящие значения под условия, да и сам код неверный из-за s==42) - что изменить в коде, чтобы он действительно работал и при других заданиях (кроме 19)?

Два игрока, Петя и Ваня, играют в следующую игру.

Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может увеличить количество камней в куче на 1, 3 или 7. Игра завершается в тот момент, когда количество камней в куче становится ровно 42. Игрок, первым получивший кучу из 42 камней, считается победителем. Игрок получивший после своего хода более 42 камней считается проигравшим и победителю засчитывается ход в 42. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.

  1. Укажите такое минимальное значение s, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим #Ответ: 38 первым ходом.
  2. Найдите два наименьших значения s, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:

— Петя не может выиграть за один ход;

— Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня. Найденные значения запишите в ответе в порядке возрастания. #Ответ: 31, 33

  1. Найдите два наименьших значение 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)

Ответы

▲ 0Принят

Возможный ответ на 19 вопрос:

def f(s,p):
    if s == 42 and p == 3: return True
    if s > 42 and p < 3: return True
    if s < 42 and p > 3: return False
    if s > 49 and p > 3: return False
    if p%2 == 0:
        return f(s+1,p+1) or f(s+3,p+1) or f(s+7,p+1)
    if p%2 != 0:
        return f(s+1,p+1) and f(s+3,p+1) and f(s+7,p+1)



for s in range(1,41):
    if f(s,1):
        print(s) #38, 40
▲ 0
def f(s,p):
    if s >= 42 and p == 3: return True
    if s > 42 and p < 3: return False
    if s+1 > 42 and s+3 > 42 and s+7 > 42: 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)