Fiche à trous · Seconde · Mathématiques
Algorithmique et programmation Python
Complétez de mémoire, puis vérifiez avec la page de corrigé.
Programmer, en mathématiques, ne sert pas à faire de l'informatique : cela sert à écrire un raisonnement de façon si précise qu'une machine puisse l'exécuter. Un algorithme qui ne marche pas n'est presque jamais un problème de langage — c'est un raisonnement incomplet, et le programme se contente de le dire tout haut.
Les briques du langage
Définition — variable et affectation :
En Python, l'indentation n'est pas une commodité de lecture : c'est la syntaxe elle-même. Ce qui est décalé sous un `if` s'exécute quand la condition est vraie ; ce qui revient à gauche s'exécute dans tous les cas. Un décalage mal placé change le programme sans provoquer d'erreur, ce qui en fait la faute la plus difficile à trouver.
Piège
Écrire `if n = 3:` au lieu de `if n == 3:`.
un `=` range, un `==` demande. Dans un `if`, on demande toujours.
Les deux boucles
Règle
Piège
Écrire une boucle `while` dont la condition ne peut jamais devenir fausse.
avant d'écrire le corps de la boucle, se demander : quelle ligne, à l'intérieur, rapproche de la sortie ? Si la réponse n'est pas immédiate, la boucle est infinie.
Les fonctions
Définition — fonction et return :
Quatre algorithmes à connaître
Chercher un maximum
- 7.
- 8.
- 9.
Exemple
L'algorithme d'Euclide calcule le PGCD de deux entiers. Le suivre à la main sur 48 et 18.
- 10.
- 11.
- 12.
- 13.
- 14.
Résultat :
Le test de primalité illustre le seul souci d'efficacité du programme de seconde. Tester tous les diviseurs de 2 à fonctionne, mais devient très lent pour un grand . Or si a un diviseur supérieur à , il en a nécessairement un inférieur : il suffit donc de tester jusqu'à . Pour , on passe d'un million de tests à mille.
Deux détails de ce programme méritent d'être remarqués. Le `return False` à l'intérieur de la boucle est ici volontaire : dès qu'un diviseur est trouvé, il n'y a plus rien à chercher, et sortir immédiatement fait gagner tout le reste du parcours. Et la condition s'écrit `d * d <= n` plutôt que `d <= sqrt(n)` : on compare deux entiers au lieu d'un entier et d'un décimal approché, ce qui supprime tout risque d'arrondi.
Piège
Écrire `return True` à l'intérieur de la boucle, symétriquement au `return False`.
on ne peut conclure « premier » qu'après avoir tout testé : le `return True` va donc à l'extérieur de la boucle, aligné avec le `while`.
- `=` range une valeur, `==` compare : ai-je le bon signe dans mon test ?
- L'indentation correspond-elle exactement à ce que je veux répéter ?
- `range(1, 11)` s'arrête à 10 : ai-je vérifié mes bornes ?
- Dans un `while` : quelle ligne rapproche de la sortie ?
- Ma fonction renvoie-t-elle avec `return`, ou se contente-t-elle d'afficher ?
- Ai-je testé mon programme sur un cas dont je connais la réponse ?