递归地找到一个正方形的区域

时间:2015-01-05 12:31:21

标签: python recursion quadtree

我有一个大方块,由固定大小的方形瓷砖制成。

这些小方块的面积是已知的。

enter image description here

其中一个图块显示在左上角。

现在,

每个方格可以分为4个子方格。每个方格都有一个标识方块的钥匙。

大广场内可能有很多空方块。在这些情况下,密钥不存在,并且该区域被视为零。

enter image description here

最小的图块的密钥长度为3。

我想以递归的方式找到给定键的任何方格的区域。

这就是我想要的。但它没有给我正确的解决方案。

findAreaRecursive(self, key, maxDepth=3):
    if len(Key) == maxDepth:
        if self.keyExists(key):
           return self.getAreaValue(key)
        else:
           return 0

    else:


        keyChild0 = key + '0'
        keyChild1 = key + '1'
        keyChild2 = key + '2'
        keyChild3 = key + '3'

        if self.keyExists(keyChild0): 
            areaChild0 = self.findAreaRecursive(keyChild0, maxDepth)
        else:
            areaChild0 = 0

        if self.keyExists(keyChild1): 
            areaChild1 = self.findAreaRecursive(keyChild1, maxDepth)
        else:
            areaChild1 = 0

        if self.keyExists(keyChild2): 
            areaChild2 = self.findAreaRecursive(keyChild2, maxDepth)
        else:
            areaChild2 = 0

        if self.keyExists(keyChild3): 
            areaChild3 = self.findAreaRecursive(keyChild3, maxDepth)
        else:
            areaChild3 = 0

        return areaChild0 + areaChild1 + areaChild2 + areaChild3

我做错了什么。我是递归的新手。欢迎任何帮助。

1 个答案:

答案 0 :(得分:2)

在我看来,你的递归查找器有点过于复杂。你有一半在函数中展开递归。以下是一个可能更“纯粹”递归的示例。如果我假设keyExists()的工作原理是,如果键的区域值为true,则返回true。

def findAreaRecursive(self, key, maxDepth=3):
    totArea = 0
    if len(key) == maxDepth:
        if self.keyExists(key):
           totArea += self.getAreaValue(key)
    else:
        for i in range(4):
            newKey = key + str(i)
            totArea += findAreaRecursive(self, newKey, maxDepth)

    return totArea

然而....

递归可能很难让你头脑发热。如果您想继续追求自己的方法,可以通过

帮助澄清您的问题
  1. 输入整个代码 - 包括getAreaValue()和keyExists()函数,我们可以查看它来计算执行路径和失败的内容。例如,您无法看到keyExists()函数的逻辑,也许有时会给出错误的值,导致代码的一个分支在您不期望它时返回零。

    < / LI>
  2. 在递归中输入一些print语句(好的,因为递归在你的情况下不是太深)。你会看到发生了什么。我从一个print语句开始,作为函数中的第一个说

    print "Called with key",key
    

    这将允许您跟踪正在调用的键,您可以按照预期的顺序检查它是否正在发生。

  3. 修改

    另请参阅this answer一个类似的问题,该问题以一种非常好的总结方式开始,这是一种思考递归的方法,因为你说你不熟悉递归。