今天看python的书籍,看到递归时又遇到递归中的一个老问题—八皇后问题,书里给出了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,state):
for pos in range(num):
if not conflict(state,pos):
if len(state) == num-1:
yield (pos,)
else:
for result in queens(num,state + (pos,)):
yield (pos,) + result
这是我到现在为止看到的程序最简短的答案了,看来python的语言表达力果然了的,这里生成器的使用使得最终数据的收集工作变的很直接,生成器是逐渐产生结果的复杂递归算法的理想实现工具,使用生成器所有的递归调用只需要创建自己的yield部分。
学习SICP的时候,嵌套映射时候也提到了八皇后问题,文中给出了程序的模版,留了3个函数自己实现,主要时判断是否冲突,于上面conflict的功能时一样的,只是python这边因为以下标作为皇后所在的行,所以传递的参数只需要一个,而Scheme中由于时通过嵌套的map,所以