使用递归Python熄灭算法

时间:2019-04-09 14:02:19

标签: python-3.x algorithm recursion

使用Lights Off算法的Python游戏

几年前,我在C++做过一场游戏。它称为Lights Off,它在递归中使用Lights Off算法。我尝试用Python对其进行编码,但是我不确定它是否按照预期的方式出现,而且我想添加零和一的矩阵。这里是方向和输出:

想象一排n的灯,它们可以在某些条件下打开和关闭,如下所示。第一个灯可以随时打开或关闭。仅当前面的指示灯亮起且之前的所有其他指示灯熄灭时,其他每个指示灯才可以打开或关闭。
如果最初所有指示灯都点亮,那么如何关闭它们呢?对于编号为1 to 3的三个灯,可以执行以下步骤,其中1是打开的灯,而0是关闭的灯:

1 1 1    Initially all on
0 1 1    turn off light 1
0 1 0    turn off light 3
1 1 0    turn on light 1
1 0 0    turn off light 2
0 0 0    turn off light 1
  

Python代码:

def turnOff(n):
    # if number of lights is less than one
    if (n < 1):
        return
    # if number of lights is greater or equal to one
    if (n == 1):
        print("Turn off light", n)
    else:
        if(n > 2):
            turnOff(n - 2)
            print("Turn off light", n)
        if(n > 2):
            turnOn(n - 2)
            turnOff(n - 1)


def turnOn(n):
    # if number of lights is less than one
    if(n < 1):
        return
    # if number of lights is 1
    if(n == 1):
        print("Turn on light", n)
    else:
        turnOn(n - 1)
    if(n > 2):
       turnOff(n - 2)
       print("Turn on light", n)
    if(n > 2):
        # call method
        turnOn(n - 2)


def main():
    n = int(input("Please enter a number of lights: "))
    print()
    print(turnOn(n))
    # print("Number of steps", count)


if __name__ == "__main__":
    main()
  

结果:

Please enter a number of lights: 3

Turn on light 1
Turn off light 1
Turn on light 3
Turn on light 1

我认为输出不正确,并且我想在其中添加零和一的矩阵。

1 个答案:

答案 0 :(得分:0)

问题似乎在于您在一开始就调用turnOn而不是调用turnOff。另外,您应该使用n > 2时使用n > 1

此外,可以通过删除和合并不必要的if条件来简化您的代码。请注意,由于您正在打印函数的返回值-不返回任何内容,因此您的代码也会打印None

如果要打印灯光矩阵,则可以使用一个列表来表示每次迭代中的灯光并进行打印,可以将该列表作为参数传递给函数。

具有所有这些改进的有效代码将如下所示:

def turnOff(n,lights):
    # if number of lights is less than one
    if n < 1:
        return
    # if number of lights is greater or equal to one
    if n == 1:
        print("Turn off light", n)
        lights[n - 1] = 0
        print(lights)
    else:
        turnOff(n - 2, lights)
        print("Turn off light", n)
        lights[n - 1] = 0
        print(lights)
        turnOn(n - 2, lights)
        turnOff(n - 1, lights)


def turnOn(n, lights):
    # if number of lights is less than one
    if n < 1:
        return
    # if number of lights is 1
    if n == 1:
        print("Turn on light", n)
        lights[n - 1] = 1
        print(lights)
    else:
        turnOn(n - 1, lights)
        turnOff(n - 2, lights)
        print("Turn on light", n)
        lights[n - 1] = 1
        print(lights)
        turnOn(n - 2, lights)


def main():

    n = int(input("Please enter a number of lights: "))
    print()

    lights = [1] * n
    print(lights)

    turnOff(n, lights)
    # print("Number of steps", count)


if __name__ == "__main__":
    main()
  

结果

Please enter a number of lights: 3

[1, 1, 1]
Turn off light 1
[0, 1, 1]
Turn off light 3
[0, 1, 0]
Turn on light 1
[1, 1, 0]
Turn off light 2
[1, 0, 0]
Turn off light 1
[0, 0, 0]

您可以使用join函数和fstrings自行格式化输出。