八皇后问题

一、何为生成器?

  • 生成器是一种用普通的函数语法定义的迭代器
  • 在Python中,一边循环一边计算的机制称为生成器
  • 生成器是一个包含yield关键字的函数。当它被调用时,在函数体中的代码不会被执行,而会返回一个迭代器。每次请求一个值,就会执行生成器中的代码,直到遇到一个yield或者return语句。yield语句意味着应该生成一个值。return语句意味着生成器要停止执行。

二、创建生成器

#!/usr/bin/env python
# _*_ coding:utf-8 _*_


def generator(lst):
    for subLst in lst:
        for i in subLst:
            yield i


if __name__ == '__main__':
    x = [[1, 2], [3, 4], [5]]
    print(list(generator(x)))


三、熟悉递归

#!/usr/bin/env python
# _*_ coding:utf-8 _*_


def fact(n):
    '''递归法求阶乘'''
    if n == 1:
        return 1
    else:
        return n * fact(n-1)

def factOpt(n,acc=1):
    '''尾递归优化'''
    if n == 0:
        return acc
    else:
        return factOpt(n-1,n*acc)

if __name__ == '__main__':
    print(fact(10))
    print(factOpt(10))


四、递归生成器

  • 递归:基本情况 + 递归情况
  • 循环与递归:当循环次数未知时,可以使用递归
#!/usr/bin/env python
# _*_ coding:utf-8 _*_


def generator_rec(lst):
    try:
        for subLst in lst:
            for element in generator_rec(subLst):  # 生成器需要遍历获取值
                yield element
    except TypeError:
        yield lst


if __name__ == '__main__':
    y = [[[1], 2], 3, 4, [5, [6, 7]], 8]
    print(list(generator_rec(y)))


五、八皇后问题

#!/usr/bin/env python
# _*_ coding:utf-8 _*_


def conflict(state, col):
    '''冲突函数;
       判断新皇后与前面每一行的皇后是否冲突;
       冲突为列相同或行列差相等'''
    row = len(state)
    for i in range(row):
        if abs(state[i] - col) in (0, row - i):
            return True
    return False


def queens(num=8, 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

if __name__ == '__main__':
    print(len(list(queens())))



你可能感兴趣的:(八皇后问题)