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=()):
    #print 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,)):
                              #生成八或N个的元组
                              yield (pos, ) + result

分析一:

1.此种方法看上去较酷,感到很高大上的编程。占用内存小,运用了生成器。

2.教材上讲了如果不能安排好下一下皇后,则进行上一个皇后的位置改变,再迭代。但我感觉是究举之后的依次判断,即列出所有可能的位置组合,再进行一一判断。

3.可以先理解,用递归实理的N层迭代。如下代码

def my_func(num, state=()):
    
    for i in range(9):
        print i,
 
        if len(state) == num-1:
            yield (len(state),)
            #print "len state",len(state)
        else:
           for result in my_func(num, state+(0,)):
                yield (len(state),)+result
                print "resault....",result

a=list(my_func(8))


4.用递归实现的N层迭代:


def test(num,state=()):
    print "start.",
    for i in range(num):
        print i,
        if len(state)==num-1:
            yield (100,)
        else:
            for result in test(num,state+(0,)):
                    print "in."
                    print "recur...len result is:  ",len(result),result
                    yield (50,)+result

a=list(test(4))
print len(a)
print a
两个yield很关键,第一个是结束递归的条件,第一个,生成N个的元组,练习时可以改i,为POS,就像八皇后了。
5.理解了4.对于八皇后,就更易理解了。加了对冲突的判断,即便是要找的解了。

你可能感兴趣的:(Python八皇后问题的学习体会与分析-递归的运用)