Где я допустил ошибку питон - Общение Python мододелов

Вопрос Где я допустил ошибку питон

Регистрация
10 Окт 2013
Сообщения
92
Репутация
0
Спасибо
0
Монет
0
я мне кажется уже в глаза долблюсь, но мой код не работает:уходит в цикл
284237885_326ce40c2b5933cf3e779bca0d5cb853_240x240.png

284237885_c1887affce27659765fcb6b48efe4763_240x240.png



, хотя по виду такой-же
 
Регистрация
27 Авг 2013
Сообщения
94
Репутация
0
Спасибо
0
Монет
0
Он не "уходит в цикл", а просто очень долго считает - т.к. многократно выполняет развесисто-рекурсивный game(x) для одних и тех же значений x.

Строчка @lru_chache гарантирует, что game(x) для каждого значения x будет выполнен единственный раз, а при появлении game(x) с тем же x ранее вычисленное значение будет взято из кэша - без вызова game. И это на порядки ускоряет выполнение подобных функций.

Хотя, похоже, ты взялся решать задачу не с того конца: это больше похоже на задачу для динамического программирования, а не для рекурсии.
 
Регистрация
28 Ноя 2013
Сообщения
96
Репутация
0
Спасибо
0
Монет
0
Выглядит, как игра, в которой игроки делают ходы, увеличивая своё текущее значение `h` на 1 или удваивая его. Ваша функция `game` определяет, кто выиграл или проиграл при определенном значении `h`, при условии, что игроки играют оптимально.

Однако, в этом коде есть проблема с бесконечной рекурсией. Без какого-то механизма кэширования или отслеживания уже рассмотренных состояний, функция `game` будет вызываться снова и снова для тех же значений `h`, что приведет к бесконечному циклу.

Один из способов исправить это - использовать декоратор `functools.lru_cache` для автоматического кэширования результатов функции `game`. Это означает, что для каждого уникального значения `h` результат будет вычислен только один раз, после чего он будет сохранен и повторно использован при последующих вызовах функции с тем же значением `h`.

Вот исправленный код:

```python
from functools import lru_cache

def moves(h):
return h+1, h*2

@lru_cache(maxsize=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 'v1'
if any(game(m) == 'v1' for m in moves(h)):
return 'p2'
if all(game(m) == 'p1' or game(m)=='p2' for m in moves(h)):
return 'v2'

for s in range(1, 200):
if game(s)=='v1':
print(s, game(s))
```

Декоратор `lru_cache` здесь делает всю работу по управлению кэшем за вас. Параметр `maxsize` установлен на `None`, что означает, что кэш может расти неограниченно. Если вы хотите ограничить размер кэша, вы можете установить `maxsize` на желаемое значение.
 
Сверху Снизу