我正在尝试解决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的事实。
尽管问题已经给出了公式,但我使用了另一个公式。因为我对多边形的面积进行了一些研究。如果您查看{{link1:here}},则该公式是不同的。
逐步描述我的程序会更好,以便解释我的意图。 好的,我不得不声明全局范围,因为涉及到递归:
请在不提供完整解决方案的情况下帮助我改进我的代码。
编辑二:
与senderle讨论后,我理解了问题所在,他的解决方案比我的更好,因此建议您使用它。无论如何,他帮助我纠正了我的代码。我不得不再次更改我的公式。
他还补充说,对于更长的多边形,顶点数量必须为3。感谢大家抽出时间。
无论如何,让我给你完整的问题:
多边形可以用(x,y)对的列表表示,其中每个对都是一个元组:[(x1,y1),(x2,y2),(x3,y3),...(xn,yn)]。编写一个递归函数来计算多边形的面积。这可以通过“切掉”一个三角形来实现,利用一个三角形的角落(x1,y1),(x2,y2),(x3,y3)的面积为(x1y1+x2y2+x3y2-y1x2-y2x3-y3x1)/2的事实。
尽管问题已经给出了公式,但我使用了另一个公式。因为我对多边形的面积进行了一些研究。如果您查看{{link1:here}},则该公式是不同的。
逐步描述我的程序会更好,以便解释我的意图。 好的,我不得不声明全局范围,因为涉及到递归:
area = 0
x = [0] * 3
y = [0] * 3
然后,我创建了一个递归函数。这个函数总是返回0作为结果。所以我的实际问题是:
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()
这是完整的代码,没有注释:
'''
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讨论后,我理解了问题所在,他的解决方案比我的更好,因此建议您使用它。无论如何,他帮助我纠正了我的代码。我不得不再次更改我的公式。
area += x[i]*y[(i+1) % 3] - x[(i+1) % 3]*y[i]
他还补充说,对于更长的多边形,顶点数量必须为3。感谢大家抽出时间。
def areaofpolygon(polygon, i=0):
可能会稍微澄清一些。 - yurisich(x1y1 + x2y2 + x3y3 + x4y3 – y1x2 –y2x3 – y3x4 - y4x1) / 2
? - yurisichxy
的最后一组匹配项(+ x3y2
)被从相同的值yx
(- y3x4
) 中减去了。因此,所有的xy
组合(除了最后一组)都会相乘...但是对于后半部分呢?...嗯。 - yurisich