1
votes

Utilisation de la théorie des ensembles pour trouver la zone de forme en Python

On me donne donc le diagramme suivant:

 entrez la description de l'image ici

Et on me demande de trouver l'aire de chaque polygone donné n. L'aire est fondamentalement la somme de tous les carrés bleus puisque chaque carré a une aire de 1. Ainsi, lorsque n = 1 , l'aire est un. Lorsque n = 2 , l'aire est de 5. En raison de la relation entre chaque polygone, je sais que je pourrais renverser cela en utilisant la théorie des ensembles.

def shapeArea(n):
    prev_output = 0
    output = 0

    if n == 1:
        output = 1
    elif n > 1:
        for i in range(n):
            prev_output = n-1 + (4 * (n-1))

    output = prev_output + (4 * (n-1))

    return output

Cependant, je n'ai pas eu autant de chance d'essayer de représenter cela dans le code:

n  Area(n)

1  1
2  A(n-1) + (4 * (n-1)) = 5
3  A(n-1) + (4 * (n-1)) = 13
4  A(n-1) + (4 * (n-1)) = 25
5  A(n-1) + (4 * (n-1)) = 41

Par exemple: Pour n = 2 , je j'obtiens une sortie de 9 au lieu de 5.


3 commentaires

En fait, votre code comporte également quelques erreurs logiques qui donnent 0 pour n = 1. Je l'ai édité, vous pouvez voir


1. Sa sortie et non sortie , 2. la ligne output = prev_output + ... doit être à l'intérieur de elif , car lorsque n = 1 , n-1 = 0 et l'ensemble de la sortie est égal à zéro


Cela ne semble rien avoir à voir avec la théorie des ensembles. Cela pourrait facilement être résolu avec une itération ou une récursivité: votre tentative a échoué parce que vous calculez exactement la même valeur prev_output encore et encore, plutôt que de construire à partir du cas n = 1. Mon approche serait d'entrer les termes connus de la séquence dans l'Encyclopédie en ligne des séquences d'entiers (oeis.org), car ils auront presque certainement une formule pour le calcul direct des valeurs: 2 * n * (n +1) +1 dans ce cas.


3 Réponses :


1
votes

Vous étiez proche :-)

Voici les petites corrections:

1 1
2 5
3 13
4 25
5 41

Exécution de ceci:

XXX

Donne cette sortie:

for n in range(1, 6):
    print(n, shapeArea(n))


1 commentaires

:) était sur le point de le suggérer. Frais.



0
votes

Dans une solution récursive, c'est beaucoup plus simple d'après votre logique.

def shape_area(n):
    if n == 1:
        return 1
    return shape_area(n-1) + 4*(n-1)


2 commentaires

RecursionError: profondeur maximale de récursivité dépassée en comparaison


Wah ... ira avec l'itération alors



0
votes

Vous pouvez utiliser l'astuce de Gauss pour créer une formule de forme fermée:

2*Area(n) = 

    1   +   4    +    8    +   12   + ... + 4(n-1)
+
    1   + 4(n-1) +  4(n-2) + 4(n-3) + ... +   4 
--------------------------------------------------
    2   +  4n    +   4n    +   4n   + ... +  4n

= (n-1)4n + 2
= 4n^2 - 4n + 2

So Area (n) = 2n 2 - 2n + 1 p >


0 commentaires