Bien lire avant de commencer : Rappel =(√2e

publicité
PC
Deuxième séance sur la récursion
Bien lire avant de commencer :
Ne pas oublier de prendre une feuille de brouillon pour visualiser vos idées sur des exemples
avant d'essayer de les finaliser à l'écran.
Ne pas oublier les conseils de la fois précédente.
Ne pas oublier de tester vos fonctions sur des exemples simples que vous êtes capables
d'évaluer au brouillon ou à l'aide de votre calculatrice (python peut faire office de calculatrice).
Récupérer la feuille ''récursion2 '' sur Cahier de Prépa : vous cliquez dessus et il devrait
vous être proposé de l'enregistrer. Une fois ceci fait, vous ouvrez IEP (python) et dans la fenêtre du
bas à droite vous cliquez sur Enregistrements et vous devez voir ''récursion2 '' sur lequel vous
cliquez. La feuille de travail apparaît et je vous demande d'y rester pour travailler puisqu'une partie
de la rédaction est déjà faite et que des exemples sont même proposés pour vous aider.
Rappel
Un schéma récursif est un procédé de calcul (en clair, une fonction) qui utilise un calcul sur
des valeurs ''antérieures'', c'est-à-dire plus petites (entier plus petit, ou bien liste plus courte,
intervalle deux fois moins long, etc ... ). Il s'exprime souvent par une formule (on a vu
n!= n × (n−1)! , u n = cos ( u n−1 ) , Fibonacci : u n = u n−1+u n−2 , la dichotomie )
Sa réalisation suppose d'avoir un test d'arrêt, de savoir que rendre dans ce cas, ensuite on n'a
plus qu'à appliquer la formule = la traduire dans le langage python qui s'occupera pour vous du reste
1) exponentiation rapide : écouter d'abord l'explication du professeur au tableau
On s'intéresse au calcul de x
n
se basant sur le principe que
{
2
x 2 p =( x p )
2
x 2 p+1=x ( x p )
Je vous rappelle que dans python n // 2 (quotient de la division euclidienne de n par 2 ) fournit
l'entier p quelle que soit la parité de l'entier n .
Je vous rappelle aussi que n % 2 == 0 (reste de la division euclidienne de n par 2 : on le lit
souvent n modulo 2 ) détermine si n est pair.
3/2
a) Réaliser ce calcul par une fonction récursive :
def puissance ( x , n ) :
#à remplir pour n ∈ ℕ
Elle ne doit donc pas utiliser l'opérateur ** d'exponentiation de python, seulement des *
p
2
Remarque : vous pouvez préférer ( x 2 )
à ( xp )
Combien de multiplications y a-t-il pour calculer ainsi x 16 ? Vous remarquerez qu'il y en a
un tout petit peu plus que si vous l'aviez fait à la main
5/2
b) Généraliser ce principe au calcul des puissance d'une matrice, d'un nombre complexe,
c'est-à-dire lorsqu'on dispose d'une multiplication qui ne soit pas nécessairement celle des réels.
C'est le grand intérêt de l'exponentiation rapide, surtout pour les matrices.
Lire les exemples proposés sur la feuille de python
def Puissance ( x , n , multiplication , neutre ) :
# à remplir
Pour les vérifications proposés sur la feuille de python, penser que ( 1+i )8=
permet de prédire le résultat du calcul que vous lancerez dans python.
iπ 8
4
( √2 e )
vous
Tester aussi le calcul de A5 si vous n'avez pas bien vu ce que réalise A.
T.S.V.P.
2) En attendant que tout le monde soit près pour les explications du prof sur le 3)
les plus rapides peuvent déjà s'attaquer à la fonction palindrome qui prend en argument un
mot (en clair une chaîne de caractères) et qui renvoie True si le mot est identique à lui même
lorsqu'on le lit de droite à gauche (c'est-à-dire lorsqu'on renverse son écriture) et False sinon.
Par exemple ''été'' et ''kayak'' sont des palindromes, tandis que ''palindrome'' n'est pas
un palindrome puisque lu à l'envers cela donne ''emordnilap'' . Les littéraires considèrent que,
comme pour la résolution de mots croisés, on ne doit pas tenir compte des accents ni de la
ponctuation ni des blancs. Vous ignorerez cette contrainte qui obligerait à tester certaines lettres
particulières : celles qui peuvent porter un accent et à ne pas tenir compte des blancs.
La clé pour trouver l'algorithme passe par voir ce que l'on fait lorsque le mot est tellement
long qu'il serait fastidieux de l'écrire à l'envers : vous trouvez en pratique très rapidement s'il n'est
pas un palindrome. Voir les exemples sur la feuille ''recursion2 '' .
Vous l'écrirez à l'aide d'une fonction récursive
et s'il vous reste du temps,
vous essayez d'écrire une autre fonction qui le réalise à l'aide d'une boucle effectuant bien
évidemment le minimum de calcul. Vous devriez conclure que la récursion demande souvent moins
d'efforts.
Pour la récursion, il suffit de savoir que pour une chaîne de caractères string l'expression
string[ debut : fin ] extrait du mot les premières lettres en ne commençant qu'à celle d'indice
debut et en s'arrêtant juste avant la lettre d'indice fin .
2) Fusion de deux listes triées ( pour préparer les cours suivants en classe )
Les explications du professeur illustrent une fois de plus l'intérêt qu'il y a à commencer à
réfléchir au brouillon : inutile d'écrire du code python si on n'a pas d'idée claire sur ce qui se passe
et ce qu'il faut faire dans les mémoires.
On considère deux suites ordonnées, par exemple
L1 = [ 3 , 5 , 7 , 11 ,13 , 17 ,19 ,23 ,29 , 31 ] et L2 =[ 2 , 4 , 8 , 16 , 32 ] et on désire fusionner
ces deux listes en une seule qui réunisse les deux listes précédentes, mais qui soit aussi ordonnée.
En l'occurrence L = [ 2 , 3 , 4 , 5 , 7 , 8 , 11 , 13 , 16 , 17 , 19 , 23 , 29 , 31 , 32 ] pour
l'exemple numérique proposé
Proposer une fonction fusion non récursive : à l'aide de tests if else , de boucle(s) qui
réalise cette opération.
( presque FIN )
Vous avez tout fait ? C'est très encourageant pour les concours et pour ne pas vous
ennuyer, je vous propose de revenir sur le 2) si vous ne l'avez pas finalisé ou bien de continuer
les parties que vous n'aviez pas abordées lors du TP précédent.
Téléchargement