1
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=()):
    for pos in range(num):
        if not conflict(state, pos):
            if len(state) == num-1:
                yield (pos,)
            else:
                results=queens(num, state + (pos,))
                for res in results:
                    yield (pos,) + res 

print list(queens(8))

これは8つのクイーンのソリューションであり、うまく機能しますが、少し変更を加えると、Pythonジェネレーターのnext()メソッドがすべて奇妙になります。

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=()):
    for pos in range(num):
        if not conflict(state, pos):
            if len(state) == num-1:
                yield (pos,)
            else:
                results=queens(num, state + (pos,))
                for res in results:
                    yield (pos,) +results.next()   //here is the change. res -->results.next()  

print list(queens(8))

[]を印刷するだけです。なんて恥ずかしい!next()メソッドが他の状況で機能する理由を理解できませんが、ここでは機能しません。

4

1 に答える 1

3

何が起こると思っていましたか?

ジェネレーターを呼び出すnextと、ジェネレーターが進み、次のアイテムが返されます。基本ケース(len(state) == num-1)は単一のアイテムしか生成しないため、その場合、イテレータを進め、StopIterationループを受信して​​終了するため、結果は返されません。

根本的な問題は、イテレータをループしながら進めようとしていることです。それがうまくいく可能性は低いです。

于 2012-09-11T11:23:40.570 に答える