【发布时间】:2012-03-15 21:01:06
【问题描述】:
我正在尝试解决 Exploring Python 书中的一个练习。但是,我想我不明白递归的概念。我写了一些递归函数。所以我知道一些方面。但是,我没有足够的经验。而且我已经停止学习编程大约一年了。
无论如何,让我给你一个完整的问题:
一个多边形可以用一个 (x, y) 对的列表来表示,其中每一对 是一个元组:[ (x1, y1), (x2, y2), (x3, y3) , ... (xn, yn)]。写一个 计算多边形面积的递归函数。这可以是 通过“切断”一个三角形来完成,使用的事实是 带角的三角形 (x1, y1), (x2, y2), (x3, y3) 的面积为 (x1y1 + x2y2 + x3y2 – y1x2 –y2x3 – y3x1) / 2.
尽管问题已经给出了公式,但我使用了另一个公式。因为,我对多边形的面积做了一些研究。如果你看看here,公式就不同了。
并且逐步描述我的程序会更好,以便解释我想要什么。 好的,由于递归,我必须声明全局范围:
area = 0
x = [0] * 3
y = [0] * 3
然后,我创建了一个递归函数。结果,此函数始终返回零。所以我真正的问题是:
def areaofpolygon(polygon, i):
global area, x, y # My variables
try: # I prefered using try statement from using if-else statements. So it is the easier I guess.
x[i], y[i] = polygon[i] # X and Y coordinates from tuple
area += (x[i]*y[i+1] - x[i+1]*y[i]) #My formula
except IndexError:
return area/2
areaofpolygon(polygon, i+1) # Here, this is my weird recursion
还有我的主要功能:
def main():
mypolygon = [(1,2), (2,5), (1,4)] # I declared polygon as tuples
# I called my function and started to count from zero, and the result will be prompted.
print(areaofpolygon(mypolygon,0))
return 0
if __name__ == '__main__':
main()
这是我没有 cmets 的完整代码:
'''
Created on Feb 24, 2012
@author: msarialp
'''
area = 0
x = [0] * 3
y = [0] * 3
def areaofpolygon(polygon, i):
global area, x, y
try:
x[i], y[i] = polygon[i]
area += (x[i]*y[i+1] - x[i+1]*y[i])
except IndexError:
return area/2
areaofpolygon(polygon, i+1)
def main():
mypolygon = [(1,2), (2,5), (1,4)]
print(areaofpolygon(mypolygon,0))
return 0
if __name__ == '__main__':
main()
编辑一个
阅读您的答案后,我明白我的代码出了什么问题。所以我决定分享我的程序的最新版本以获得其他帮助。 同样,我必须声明全局变量。如何从 senderle 应用 (lop_triangle) 函数
area = 0
x = [0] * 3
y = [0] * 3
分割元组并获取 x 和 y 坐标的函数。
def sides_of_polygon(polygon, i):
global x, y
try:
x[i], y[i] = polygon[i]
return sides_of_polygon(polygon, i+1)
except IndexError:
return x, y
我的函数计算多边形的面积(和以前一样)
def area_of_polygon(x, y, i):
global area
try:
area += x[i]*y[i+1] - x[i+1]*y[i]
return area_of_polygon(x, y, i+1)
except IndexError:
return area/2.0
我的主要功能...
def main():
mypolygon = [(1,2), (2,5), (1,4)]
dx, dy = sides_of_polygon(mypolygon, 0)
print(area_of_polygon(dx,dy,0))
return 0
if __name__ == '__main__':
main()
请在不提供完整解决方案的情况下帮助我改进我的代码。
编辑两个
在和senderle讨论之后,我明白了问题出在哪里,senderle的解决方案比我的好,所以我建议你应该使用它。 无论如何,他帮助我使我的代码正确。我不得不再次更改我的公式。
area += x[i]*y[(i+1) % 3] - x[(i+1) % 3]*y[i]
他还添加了更长的多边形 3 必须是 len(vertices)。 感谢大家的宝贵时间。
【问题讨论】:
-
快速说明:
def areaofpolygon(polygon, i=0):可能会澄清一点。 -
问题:四边形多边形的公式是
(x1y1 + x2y2 + x3y3 + x4y3 – y1x2 –y2x3 – y3x4 - y4x1) / 2吗? -
根据问题,是的。但是,在我看来,真正的人是不同的。它必须是 (x1*y2 + x2*y3 + x3*y4 - x2*y1 - x3*y2 - x4*y3) / 2
-
好吧,你的部分问题会自行消除——从相同的值
yx(- y3x4) 中减去xy(+ x3y2) 的最后一个配对。所以,所有对xy(保存最后一个)都相乘......但是后半部分呢?......嗯。 -
@Droogans 这里是关于公式的链接:mathworld.wolfram.com/PolygonArea.html
标签: python recursion polygon area