首页 > 解决方案 > 尝试减少重复性 - 除了

问题描述

我想知道如何压缩这段代码:

def chain_reaction(map, coord):

    explosion = map[coord[0]][coord[1]]
    map[coord[0]][coord[1]] = 0

    for i in range(1, explosion + 1):
        try:
            if map[coord[0] + i][coord[1]] != 0:
                chain_reaction(map, (coord[0] + i, coord[1]))
        except IndexError:
            pass

        try:
            if map[coord[0] - i][coord[1]] != 0:
                chain_reaction(map, (coord[0] - i, coord[1]))
        except IndexError:
            pass

        try:
            if map[coord[0]][coord[1] + i] != 0:
                chain_reaction(map, (coord[0],coord[1] + i))
        except IndexError:
            pass

        try:
            if map[coord[0]][coord[1] - i] != 0:
                chain_reaction(map, (coord[0], coord[1] - i))
        except IndexError:
            pass

        try:
            map[coord[0] + i][coord[1]], map[coord[0] - i][coord[1]] = 0, 0
            map[coord[0]][coord[1] + i], map[coord[0]][coord[1] - i] = 0, 0
        except IndexError:
            pass

    return map

map = [[0,1,0,2], [3,0,1,1], [0,1,0,1], [0,0,2,0], [1,0,0,0]]

chain_reaction(map, (3,2))

该脚本的目标是在给定地图的情况下模拟爆炸的连锁反应,其中任何正整数都是炸弹,其值是其大小。如果爆炸击中另一颗炸弹,则会导致该炸弹爆炸。

我们还将第一次爆炸作为坐标。

我的主要问题是我似乎无法找到一种仅使用 try - except 工具而不在每种情况下都使用它的方法。

PS这是一个老考试题,我们被告知我们不能导入任何模块,我们将根据效率评分

标签: pythonfunctionmatrixrepeattry-except

解决方案


异常处理应该保留给......好吧......异常。如果您的常规控制流依赖于异常,那么您可能做错了什么*。

除了访问a[x]和检查异常,您还可以首先检查 if x < len(a),即 ifx是一个有效值。尝试从那里重写您的代码。

作为循环的一部分,有多种方法可以查看所有四个方向,但我认为这些方法不一定会使代码更易于阅读。

*) 一旦你开始超越这个相对简单的代码,它就会变得更加复杂。Python 与许多其他语言的不同之处在于它主动使用异常来进行流控制。现在,我会尽量远离他们,一旦你更熟悉这种语言,我就会重新访问链接。


推荐阅读