Замена yield на возврат в рекурсивном коде - PullRequest
0 голосов
/ 07 декабря 2018

Как мне удалить операторы yield в этом коде и вместо этого использовать его как обычную функцию с операторами возврата?

def solve(game_board):
   num_occupied, board_layout=game_board
   if num_occupied < 2:
     yield (None, game_board)
   else:
     for move in possible_moves():
       new_game_board = do_move(game_board, move)
       if new_game_board:
         for item in solve(new_game_board):
           solved_num_occupied, solved_game_board = item 
           yield (move, solved_num_occupied), solved_game_board

Решатель предназначен для треугольной игры в пасьянс с колышками с 15 индексами.Структура game_board - это кортеж, содержащий количество занятых мест на доске и массив из 15 элементов, содержащий 1 или 0, в зависимости от того, есть ли там колышек.

Я старался изо всех сил,сохранение (move, solved_num_occupied), solved_game_board в массиве и возврат их после одного из циклов for, но он всегда выходит пустым.Я думаю, что просто не понимаю, как работает генератор и где он заканчивается.Любая помощь будет принята с благодарностью!

Вот полный код, если необходимо (примечание: я изменил имена переменных в функции, прежде чем поместить ее здесь, чтобы сделать ее более понятной): https://pastebin.com/raw/dEyLY2SH

1 Ответ

0 голосов
/ 07 декабря 2018

Накапливай все сразу и возвращай вместо того, чтобы давать по одному.Как я уже сказал в своем комментарии, просто замените каждый yield звонок на list.append.

def solve(game_board):
  # Initialise your list.
  moves = []
  num_occupied, board_layout=game_board
  if num_occupied < 2:
    # First change.
    moves.append((None, game_board))
  else:
    for move in possible_moves():
      new_game_board = do_move(game_board, move)
      if new_game_board:
        for item in solve(new_game_board):
          solved_num_occupied, solved_game_board = item 
          # Second change
          moves.append(((move, solved_num_occupied), solved_game_board))
  # Final change.
  return moves
...