我有一个大方块,由固定大小的方形瓷砖制成。
这些小方块的面积是已知的。
其中一个图块显示在左上角。
现在,
每个方格可以分为4个子方格。每个方格都有一个标识方块的钥匙。
大广场内可能有很多空方块。在这些情况下,密钥不存在,并且该区域被视为零。
最小的图块的密钥长度为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
我做错了什么。我是递归的新手。欢迎任何帮助。
答案 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
然而....
递归可能很难让你头脑发热。如果您想继续追求自己的方法,可以通过
帮助澄清您的问题输入整个代码 - 包括getAreaValue()和keyExists()函数,我们可以查看它来计算执行路径和失败的内容。例如,您无法看到keyExists()函数的逻辑,也许有时会给出错误的值,导致代码的一个分支在您不期望它时返回零。
< / LI>在递归中输入一些print语句(好的,因为递归在你的情况下不是太深)。你会看到发生了什么。我从一个print语句开始,作为函数中的第一个说
print "Called with key",key
这将允许您跟踪正在调用的键,您可以按照预期的顺序检查它是否正在发生。
修改强>
另请参阅this answer一个类似的问题,该问题以一种非常好的总结方式开始,这是一种思考递归的方法,因为你说你不熟悉递归。