Python基础教程 第三版 八皇后 递归 迭代器 生成器

    科技2024-06-18  68

    Python基础基础教程中,第九章讲到了八皇后,书中的代码中迭代器、生成器、递归的使用比较难理解,对代码进行了就修改以方便理解。

    书中的解决方案

    def conflict(state, nextX): nextY = len(state) for i in range(nextY): if abs(state[i] - nextX) in (0, nextY - i): return True return False def queens(num=8, state=()): print('start:',state) for pos in range(num): if not conflict(state, pos): if len(state) == num-1: print('last:',pos) yield (pos,) else: for result in queens(num, state + (pos,)): print('yield','inside:',state,'pos:',pos,'result:',result) yield (pos,) + result print('inside',state,'end') print(list(queens(4)))

    输出结果

    start: () start: (0,) start: (0, 2) inside (0, 2) end start: (0, 3) start: (0, 3, 1) inside (0, 3, 1) end inside (0, 3) end inside (0,) end start: (1,) start: (1, 3) start: (1, 3, 0) last: 2 yield inside: (1, 3) pos: 0 result: (2,) yield inside: (1,) pos: 3 result: (0, 2) yield inside: () pos: 1 result: (3, 0, 2) inside (1, 3, 0) end inside (1, 3) end inside (1,) end start: (2,) start: (2, 0) start: (2, 0, 3) last: 1 yield inside: (2, 0) pos: 3 result: (1,) yield inside: (2,) pos: 0 result: (3, 1) yield inside: () pos: 2 result: (0, 3, 1) inside (2, 0, 3) end inside (2, 0) end inside (2,) end start: (3,) start: (3, 0) start: (3, 0, 2) inside (3, 0, 2) end inside (3, 0) end start: (3, 1) inside (3, 1) end inside (3,) end inside () end [(1, 3, 0, 2), (2, 0, 3, 1)]
    Processed: 0.017, SQL: 8