Ces exercices se rapprochent de l'exponentiation. On écrit par exemple des chose comme :
Avec un seul paramètre :
f(n) = 1 + f(n-1)
f(n) = 2 * (n-1)
f(n) = n + f(n-1)
f(txt) = txt[0] + f(txt[1:])
f(lst) = [ lst[0] ] + f( lst[1:] )
f(lst) = lst[0] < lst[1] and f( lst[1:] )
ou avec deux paramètres, on trouvera des choses comme :
f(a, n) = a * f(a, n-1)
f(a, n) = 1 + f(a, n-1)
f(x , lst) = (x == lst[0]) or f(x , lst[1:] ) # ! la fct renvoie un booléen
f(lettre,txt) = ( lettre == txt[0] ) + f(lettre,txt[1:]) # ! La fct renvoi un int
Pour les booléens il y a parfois quelques subtilités....
f(x , lst) = (x == lst[0]) or f(x , lst[1:] ) # ! la fct renvoie un booléen
rappellez vous que pour évaluer condition1 or condition2 python n'évalue condition2 que si condition1 s'évalue à False.
En d'autres termes, si x==lst[0] est True, on ne fera pas l'appel récursif ! C'est ce qu'on fait dans appartient(x,lst), quand on le trouve, plus besoin de continuer...
autre exemple :
f(lettre,txt) = ( lettre == txt[0] ) + f(lettre,txt[1:]) # ! La fct renvoi un int
Ici il y a une addition d'un booléen avec f(..). Les seules additions autorisées avec des booléens sont :
bool + bool -> int
bool + int -> int
exemple :
False + False s'évalue à 0 (False est converti en 0, True en 1)
False + 3 s'évalue à 3
True + 1 s'évalue à 2
a = 1
print( (a==1) + 1 )
ce code affiche 2
Dans la récursion cela peut être parfois bien utile, mais on pourrait s'en tirer autrement (et c'est recommandé si ce qui précède ne vous semble pas clair pour vous) :
f(lettre,txt) = ( lettre == txt[0] ) + f(lettre,txt[1:]) # ! La fct renvoi un int
sera identique à :
if lettre == txt[0] :
n = 0
else :
n = 1
return n + f(lettre,txt[1:])
c'est juste plus facile de lire le code en une ligne que le code
de 5 lignes....
il est plus élégant, mais recommandé seulement quand on maitrise
bien les problèmes de typages des expressions.
La chose vraiment à retenir : respectez les types !
Si la fonction renvoie une list, les return (du cas de base comme du cas général) devront renvoyer une list.
si on veux construire la list en ajoutant un nombre à chaque appel, le return du cas général sera forcément du genre :
return [a] + f(...) Les ... indique qu'on rapelle la fonction avec de nouveaux paramètres (une liste modifiée, ou un paramètre avec une valeur modifiée etc...)
ex 1 - somme de n entiers
ex 2 - addition unitaire
Dans cet exercice nous voulons calculer la somme a + b, mais de façon très basique.
Imaginez deux tas, à gauche a cailloux et à droite, b cailloux.
pour ajouter b à a, je passe les cailloux UN PAR UN du tas de droite au tas de gauche.
je compte donc jusqu'à a, puis a chaque cailloux ajouté, j'augmente de 1, et le tas de droite diminue. Quand le tas de droite est vide, je sais combien vaut a + b.
Ce processus est similaire à la fonction récursive demandée ci-dessous.
ex 3 - longueur
ex 4 - my_range
Dans cet exercice nous allons écrire un substitut de la fonction range()
Avec des chaînes de charactères
Le principe sera le même : décomposer le problème en une opération simple et une répétition du problème légèrement simplifié.
Dans les exercices qui suivent, essayez de comprendre comment on peut décomposer le problème, cela vous indiquera la solution.
ex 5 - repeteur
ex 6 - reverse
ex 7 - Anagrammes
ex 8 - la tête à toto
Dans cet exercice vous pouvez utiliser la méthode replace des objets string :
Testez dans un environnement python ou dans la console pour bien comprendre le fonctionnement de la méthode replace.
exemple
s = 'abacab'
print(s.replace('b','B'))
print(s.replace('b','B',1))
print(s.replace('bac','BAC'))
Quand vous avez bien compris le fonctionnement de replace(), il faut réfléchir au problème sur un cas simple. Que renverront ces appels :
Si vous avez réussit les 2 exercices précédents, celui là devrait vous sembler assez simple.
Avec une liste
ex 9 - test tri
Des algos un peu plus complexes
ex 10 - somme digitale
ex 11 - Conversion
On rappelle l'algorithme qui permet de convertir un nombre entier écrit en décimal en une chaine binaire équivalente.
fonction dec2bin(n) :
chaine = ""
tant que n est non nul :
chaine = str(n%2) + chaine # on ajoute le reste de n/2 en tête dans la chaine
n = n//2 # on recommence avec le quotient de n/2
fin tant que
renvoyer chaine
Avec deux fonctions qui s'appellent mutuellement
ex 12 - Exercice Pair Impair
Dans cet exercice, vous ne pouvez utiliser Vous ne devez utiliser les opérateur % et / ou //
il faut répéter n fois le texte, c'est comme l'écrire une première fois puis le répéter n-1 fois....
retourner 'abc' c'est comme écrire retourner 'bc' suivi de 'a'
retourner('abc') est égal à retourner('bc') + 'a'
Remplacer n fois les 0 par (0 + 0) c'est pareil que le faire une fois et le refaire n - 1 fois...
Afficher les entiers de i à k est pareil qu'afficher i (sans aller à la ligne, mais avec un espace) puis les entiers de i+1 à k
Attention : la condition d'arrêt (cas de base) n'est pas n=0 ou n=1 dans ce cas. Quel cas trivial voyez vous ? et êtes vous sur que l'on finira par l'atteindre ?
[3, 4, 7, 11] est triée.
Pour le savoir, on pourrait vérifier que 3 <= 4 puis que [4 , 7, 11] est triée....
Enlevez un chiffre et utilisez votre fonction sommeDigital pour calculer la somme digital des chiffres restant.
Utilisez n % 10 et n // 10 pour travailler avec un chiffre à la fois.
exemple d'utilisation : 2345%10 = 5 2345//10=234
la somme des chiffres de 2345 est donc 2345%10 (qui vaut 5) + la somme des chiffres de 2345//10 (qui vaut 234)
si n est pair est Vraie, alors (n-1) est impair est Vraie aussi.
Et si n est pair est Fausse, alors (n-1) est impair est Fausse aussi.