def conflict(state, nextX):
print('state:',state)
nextY = len(state)
for i in range(nextY):
print("i=",i)
if abs(state[i]-nextX) in (0, nextY-i):
print('confict')
return True
return False
def queens(num=8, state=()):
for position in range(num):
print('***')
print('pos:',position)
if not conflict(state, position):
if len(state) == num-1:
print('back to 1st_space_____________position:',position)
yield (position,)
else:
print('Into 2nd_space__________recursive')
for result in queens(num, state + (position,)):
print('membersihip position:',position)
print('membership result:',result)
yield (position,) + result
else:
print('branch end')
pass
重点是recursive的理解,可以采用多重空间理解法,在第二重空间循环完毕后,别忘了回溯至第一重空间继续运行。因为,第二重函数是第一重函数递归迭代进去的。
>>>print(next(queens(4,(1,3,0))))
***
pos: 0
state: (1, 3, 0)
i= 0
i= 1
i= 2
confict
branch end
***
pos: 1
state: (1, 3, 0)
i= 0
confict
branch end
***
pos: 2
state: (1, 3, 0)
i= 0
i= 1
i= 2
back to 1st_space_____________position: 2
(2,)
>>>print(next(queens(4,(1,3))))
pos: 0
state: (1, 3)
i= 0
i= 1
Into 2nd_space__________recursive
***
pos: 0
state: (1, 3, 0)
i= 0
i= 1
i= 2
confict
branch end
***
pos: 1
state: (1, 3, 0)
i= 0
confict
branch end
***
pos: 2
state: (1, 3, 0)
i= 0
i= 1
i= 2
back to 1st_space_____________position: 2
membersihip position: 0
membership result: (2,)
(0, 2)
>>>print(next(queens(5)))
***
pos: 0
state: ()
Into 2nd_space__________recursive
***
pos: 0
state: (0,)
i= 0
confict
branch end
***
pos: 1
state: (0,)
i= 0
confict
branch end
***
pos: 2
state: (0,)
i= 0
Into 2nd_space__________recursive
***
pos: 0
state: (0, 2)
i= 0
confict
branch end
***
pos: 1
state: (0, 2)
i= 0
i= 1
confict
branch end
***
pos: 2
state: (0, 2)
i= 0
confict
branch end
***
pos: 3
state: (0, 2)
i= 0
i= 1
confict
branch end
***
pos: 4
state: (0, 2)
i= 0
i= 1
Into 2nd_space__________recursive
***
pos: 0
state: (0, 2, 4)
i= 0
confict
branch end
***
pos: 1
state: (0, 2, 4)
i= 0
i= 1
i= 2
Into 2nd_space__________recursive
***
pos: 0
state: (0, 2, 4, 1)
i= 0
confict
branch end
***
pos: 1
state: (0, 2, 4, 1)
i= 0
i= 1
i= 2
i= 3
confict
branch end
***
pos: 2
state: (0, 2, 4, 1)
i= 0
i= 1
confict
branch end
***
pos: 3
state: (0, 2, 4, 1)
i= 0
i= 1
i= 2
i= 3
back to 1st_space_____________position: 3
membersihip position: 1
membership result: (3,)
membersihip position: 4
membership result: (1, 3)
membersihip position: 2
membership result: (4, 1, 3)
membersihip position: 0
membership result: (2, 4, 1, 3)
(0, 2, 4, 1, 3)
更多数学原理小文请关注公众号:未名方略