【问题标题】:Replacing yield with returns in recursive code用递归代码中的 return 替换 yield
【发布时间】:2018-12-07 03:36:06
【问题描述】:

如何删除此代码中的 yield 语句,而将其用作带有 return 语句的普通函数?

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 个元素的数组,根据是否有 peg 包含 1 或 0。

我已尽力将(move, solved_num_occupied), solved_game_board 存储在一个数组中,并在for 循环之一之后返回它们,但它总是空的。我想我只是不太了解生成器是如何运行的,以及它在哪里终止。任何帮助将不胜感激!

这里是完整的代码,如果需要的话(注意:我在把它放在这里之前更改了函数中的变量名,以便更容易理解):https://pastebin.com/raw/dEyLY2SH

【问题讨论】:

  • 无论哪里有产量,通过附加到一个列表来替换它;然后在最后返回列表。

标签: python generator yield


【解决方案1】:

一次积累一切并返回,而不是一次产生一个。就像我在评论中所说的那样,只需将每个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-05
    • 2022-12-06
    • 2020-12-02
    • 1970-01-01
    • 2020-06-16
    • 2022-11-03
    相关资源
    最近更新 更多