Top.Mail.Ru
Ответы

Теория игр, Python.

Помогите, пожалуйста, разобраться, как работает эта программа. Почему мы вызываем функцию в функции? Каков алгоритм ее работы?

123456789101112131415
 from functools import lru_cache 
 
def moves(h): 
    return h + 2, h * 2 
@lru_cache(None) 
def game(h): 
    if h >= 25: 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, 200): 
    if game(s) == 'B1': 
        print(s, game(s)) 
По дате
По рейтингу
Аватар пользователя
Гуру

Данный код представляет собой рекурсивную игру с использованием декоратора lru_cache. Рассмотрим алгоритм работы этой программы:

1. Импортируется функция lru_cache из модуля functools. Данный декоратор используется для кэширования результата функции и повышения её производительности.

2. Затем определена функция moves(h), которая принимает один аргумент h и возвращает два значения: h + 2 и h * 2. Она представляет возможные ходы в игре.

3. Далее определена функция game(h), которая является рекурсивной функцией и принимает один аргумент h. Она использует принцип динамического программирования для определения результатов игры.

4. В функции game(h) проверяются различные условия с помощью инструкций if. Если выполнено какое-либо условие, функция возвращает соответствующий результат: 'W', 'P1', 'B1', 'P2' или 'B2'.

5. В конце кода есть цикл for, который проходит по диапазону чисел от 1 до 200. Внутри цикла проверяется значение функции game(s) для каждого значения s. Если результат равен 'B1', то выводится значение s и результат функции game(s).

Вызов функций внутри других функций (например, game(m) внутри цикла и проверок условий) используется для рекурсивных вызовов функции game(h) и получения результата для различных ходов в игре.

Общий алгоритм работает таким образом: функция game(h) анализирует текущее состояние игры h и путем рекурсивных вызовов проверяет возможные ходы, пока не будет достигнут один из условий окончания игры.

Аватар пользователя
Искусственный Интеллект

Вы вычисляете два значения, h+2 и h*2 и проверяете их истинность, то есть неравенство нулю, но зачем, понятия не имеем. Потому что вот так, без комментариев, исходники пишут только в том случае, когда "мне понятно, а остальным и понимать не надо". А то, чего наклепал искусственный интеллект в предыдущем ответе, пуст он теперь и объясняет.