On me donne donc le diagramme suivant:
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 Réponses :
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))
:) était sur le point de le suggérer. Frais.
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)
RecursionError: profondeur maximale de récursivité dépassée en comparaison
Wah ... ira avec l'itération alors
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 >
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 nonsortie
, 2. la ligneoutput = prev_output + ...
doit être à l'intérieur deelif
, car lorsquen = 1
,n-1 = 0
et l'ensemble de lasortie
est égal à zéroCela 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.