找到一个n有趣的多边形的面积。

21

考虑:

Enter image description here

我正在尝试找到一个n有趣的多边形的面积,其中(n=1,A=1,n=2,A=5,n=3,A=13,n=4,A=25等)。 因此,n有趣的多边形的公式是(n-1)有趣的多边形的面积+(n-1)*4。当运行程序时,隐藏的测试显示代码是错误的。我的代码哪里出了问题?
def shapeArea(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    for i in range(2, n+1):
        return (shapeArea(n-1) + (n-1)*4)

为什么需要for循环?它是无用的,除非i==2。面积的确切公式是什么?你代码中的公式对于n=3给出13而不是8,但对于4则是25... - Amaro Vita
在这种情况下,你的代码没有任何问题。 - Aran-Fey
2
可能是隐藏的测试用例使用了一些大数调用了您的函数,并因超时或堆栈限制而终止。尝试找到一个不使用递归的shapeArea(n)的显式公式。在我的机器上,shapeArea(1000)已经失败了。 - Dima Chubarov
@DmitriChubarov 我认为那就是问题所在。 - M-M
如果n=1,则需要在第2行的控制语句中返回1,“if n==0”用于递归调用;否则,将返回面积为0。for循环是不必要的,但不应该引起任何实际问题。 - Charley Erd
请查询 https://oeis.org/A001844。 - lhf
22个回答

40

因为已经有了编程示例,所以我将解释为什么公式是n * n + (n-1) * (n-1)

  1. 您需要斜着看图形
  2. 您会注意到边的长度始终为n
  3. 例如,如果n=4,则该形状每侧有4个正方形,因此为n * n
  4. 但是,如果您注意到,n * n并没有计算所有正方形。您已经考虑到的正方形之间还有正方形
  5. 减去您用n * n计算过的正方形,现在您会注意到形状的边长变成了n-1
  6. 因此,考虑中间的正方形,公式就是n * n + (n-1) * (n-1)
  7. 例如:如果n = 4,则外部正方形为4 * 4 = 16。然后,减去您刚刚计算过的面积,内部正方形为3 * 3 = 9。加在一起,您就得到了25。

1
谢谢您的解释!这使得理解解决方案更容易了! - flopperJ
9
这个YouTube视频通过出色的视觉解释说明了为什么那是正确的公式。链接:https://youtu.be/zKrDTVsQ-F4?t=796 - Nei
@Nei 你说得对。这比我试图让读者想象的一大堆文字好多了。 - ProFire

32

我找到了没有递归的公式。测试通过了。

def shapeArea(n):
    if n>=10**4 or n<1:
        return False

    return (n**2+(n-1)**2)

8
请问您能否解释一下您是如何得出这个公式的?它对我有用,但我想了解为什么。请将其翻译为中文。 - Z41N
你是如何想出这个公式的?公式为:n^2+(n-1)^2 - avatarZuko
5
如果你将图形分成四个象限,并且让它们与中心正方形对齐,那么这个过程在视觉上会变得非常简单:你会得到四个不同大小的"三角形",其中最大的两个可以组成n²,最小的两个可以组成(n-1)²。请注意,这样做并不改变原意。 - l0b0

10

我认为你写的“for”循环部分有问题。如果您已经在使用递归,为什么还需要“for”循环?不过,我没有使用递归就这样做了:

def shapeArea(n):
    if n == 1:
        return 1
    return n**2 + (n-1)**2

这并不是有效的Python代码。你能不能 修复 它?(但是请不要包含 "Edit:", "Update:" 或类似的内容 - 问题/回答应该看起来像是今天写的。) - Peter Mortensen

10

在JavaScript中最简单的解决问题的方法:

function shapeArea(n) {
    if(n<0) {
        return false
    }
    return (n*n) + ((n-1)*(n-1))
}

console.log(shapeArea(1))

3
OP 的问题是关于 Python 的。 - General Grievance

7

这里提供一种用于推导公式的方法。

图形总是有一个横线穿过中间。如果你画一个矩形包含顶部的正方形和横线,其中将始终存在足够大的空白方块空缺,可以被下方的方块部分填充。

想象一下,在上面的空缺中填充下面的方块。除了n=1之外,你的形状将变为一个仍然有一些白色方块的矩形。让我们看几个例子。

n=2                n=3                         n=4

. X .   X X .      . . X . .    X X X . .      . . . X . . .    X X X X . . .
X X X   X X X      . X X X .    X X X X X      . . X X X . .    X X X X X X X
. X .   . . .      X X X X X    X X X X X      . X X X X X .    X X X X X X X
                   . X X X .    . . . . .      X X X X X X X    X X X X X X X
                   . . X . .    . . . . .      . X X X X X .    . . . . . . .
                                               . . X X X . .    . . . . . . .
                                               . . . X . . .    . . . . . . .

新的形状可以用以下公式描述:面积 = 高度 * 宽度 - 间隙 如果我们将其制成图表以寻找规律,它看起来像这样:
n | height | width | gap
1 |    1   |   1   |  0
2 |    2   |   3   |  1
3 |    3   |   5   |  2
4 |    4   |   7   |  3

高度和间距都按照1计数,而宽度则按照2的步进进行计数。你始终可以将这种线性趋势表示为n*skipValue +/- constant。在此情况下,

height=n
width=2n-1
gap=n-1

将这些术语代入我们的间隙矩形面积公式中,area = height * width - gap 变为 area = n * (2n - 1) - (n - 1)

3
这可能是一个解决方案:
function shapeArea(n) {
    return ((n-1) * (n*2)) + 1;
}

2
我认为这个解释不够充分,因此并不足以令人信服以获得点赞。另外,我建议在回答帖子中不要使用修辞性问题,因为它们经常会被误解为提出澄清问题,从而导致它们被标记并删除为非答案。 - Yunnosch
什么编程语言?C#JavaJavaScript?还是其他的? - Peter Mortensen
好的精确答案。 - MMH

2
def shapeArea(n):
  if n == 1:
    return 1
  square_side = n+n-1
  outer_square_area = square_side**2
  white_pieces = 4*(1/2)*n*(n+1)
  area = outer_square - white_pieces
  return area


问题的另一种方法:
如果您注意到,每个n有趣的多边形都可以包含在一个边长为2n-1的周围正方形中。可以取这个“外部正方形”,并减去缺失的白色空间的面积。
为白色区域提供公式是棘手的,因为您必须将每个4个侧面上的这些奇怪的楼梯状块相加。这些奇怪块的面积实际上可以使用连续整数或1/2*N(N+1)的公式计算(对于此问题N=n-1)。
例如,对于n=2,可以轻松看出更大的周围正方形的边长为2+(2-1)=3,因此总面积为9 - 4 = 5。
要更好地理解如何计算白色区域的连接,请参见该公式背后的可视化。请注意,计算这些三角形块的面积类似于将1…n的整数相加。

1

这些对我来说很好用。

n*n + (n-1) * (n-1)

n * (2*n - 1) - (n-1)

1
如果我们看到给定的例子,
当n=1时,poly = 1
当n=2时,poly = 5
当n=3时,poly = 13
当n=4时,poly = 25
下一个模式可以通过公式2n(n-1) + 1找到:
def shapeArea(n):
    return 2 * n * (n - 1) + 1;

Please include an explanation - mousetail
如果你看这个例子,当n=1时,poly = 1,当n=2时,poly = 5,当n=3时,poly = 13,当n=4时,poly = 25。因此下一个模式可以通过公式2*n*(n-1)+1找到。 - Jay Prakash Thakur
1
请编辑您的帖子,不要在评论中发布。 - mousetail

1

这个代码(Python 3)是有效的:

def shapeArea(n):
    area = n*n + (n-1)*(n-1)
    return area

print(shapeArea(5))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接