• Aucun résultat trouvé

Programmationetfonctions INFO1-semaines39à42 GuillaumeCONNAN

N/A
N/A
Protected

Academic year: 2022

Partager "Programmationetfonctions INFO1-semaines39à42 GuillaumeCONNAN"

Copied!
248
0
0

Texte intégral

(1)

Programmation et fonctions

INFO1 - semaines 39 à 42

Guillaume CONNAN septembre 2015 Iut de Nantes - Dpt d’informatique

(2)

Sommaire

1 Fonctions pures 2 Fonctions impures 3 lambda expressions

4 Composition 5 Récursion

6 Raisonnement par récurrence

(3)

Sommaire

1 Fonctions pures 2 Fonctions impures 3 lambda expressions

4 Composition 5 Récursion

6 Raisonnement par récurrence

(4)

Départ DOMAINE Arrivée CODOMAINE Une fonction est une relation

C’est donc une partie (sous-ensemble) de DOMAINE ⊗ CODOMAINE

...mais il n’y a pas deux couples ayant le même premier élément

(5)

Départ DOMAINE Arrivée CODOMAINE Une fonction est une relation

C’est donc une partie (sous-ensemble) de DOMAINE ⊗ CODOMAINE

...mais il n’y a pas deux couples ayant le même premier élément

(6)

Départ DOMAINE Arrivée CODOMAINE Une fonction est une relation

C’est donc une partie (sous-ensemble) de DOMAINE ⊗ CODOMAINE

...mais il n’y a pas deux couples ayant le même premier élément

(7)

Départ DOMAINE Arrivée CODOMAINE Une fonction est une relation

C’est donc une partie (sous-ensemble) de DOMAINE ⊗ CODOMAINE

...mais il n’y a pas deux couples ayant le même premier élément

(8)

Départ DOMAINE Arrivée CODOMAINE Une fonction est une relation

C’est donc une partie (sous-ensemble) de DOMAINE ⊗ CODOMAINE

...mais il n’y a pas deux couples ayant le même premier élément

(9)

Départ DOMAINE Arrivée CODOMAINE Une fonction est une relation

C’est donc une partie (sous-ensemble) de DOMAINE ⊗ CODOMAINE

...mais il n’y a pas deux couples ayant le même premier élément

(10)

Départ DOMAINE Arrivée CODOMAINE Une fonction est une relation

C’est donc une partie (sous-ensemble) de DOMAINE ⊗ CODOMAINE

...mais il n’y a pas deux couples ayant le même premier élément

(11)

Départ DOMAINE Arrivée CODOMAINE Une fonction est une relation

C’est donc une partie (sous-ensemble) de DOMAINE ⊗ CODOMAINE

...mais il n’y a pas deux couples ayant le même premier élément

(12)

Départ DOMAINE Arrivée CODOMAINE Une fonction est une relation

C’est donc une partie (sous-ensemble) de DOMAINE ⊗ CODOMAINE

...mais il n’y a pas deux couples ayant le même premier élément

(13)

Donc la fonction double de domaine { 1 , 2 , 3 , ... } est

{( 1 , 2 ) , ( 2 , 4 ) , ( 3 , 6 ) , ... }

(14)

Donc la fonction double de domaine { 1 , 2 , 3 , ... } est

{( 1 , 2 ) , ( 2 , 4 ) , ( 3 , 6 ) , ... }

(15)

La fonction addition de domaine { 1 , 2 , 3 , ... } ⊗ { 1 , 2 , 3 , ... } est

{(( 1 , 1 ) , 2 ) , (( 1 , 2 ) , 3 ) , ... (( 5 , 7 ) , 12 ) , (( 5 , 8 ) , 13 ) , ... }

(16)

La fonction addition de domaine { 1 , 2 , 3 , ... } ⊗ { 1 , 2 , 3 , ... } est

{(( 1 , 1 ) , 2 ) , (( 1 , 2 ) , 3 ) , ... (( 5 , 7 ) , 12 ) , (( 5 , 8 ) , 13 ) , ... }

(17)

Mais bon, ça manque un peu de dynamisme.

(18)
(19)

Départ Ð→ Arrivée

(20)

Départ Ð→ Arrivée

(21)

Exemple 1

On veut mettre une chaîne de caractères en majuscules

On commence par créer une fonction qui met une chaîne de longueur 1 en majuscule.

Cela ne concerne que les lettres minuscules.

On manipule les unicodes correspondant.

Les lettres minuscules ont un code entre 97 et 97 + 26

La majuscule correspondant a un code diminué de 2

5

La fonction doit retourner une chaîne de longueur 1

(22)

Exemple 1

On veut mettre une chaîne de caractères en majuscules

On commence par créer une fonction qui met une chaîne de longueur 1 en majuscule.

Cela ne concerne que les lettres minuscules.

On manipule les unicodes correspondant.

Les lettres minuscules ont un code entre 97 et 97 + 26

La majuscule correspondant a un code diminué de 2

5

La fonction doit retourner une chaîne de longueur 1

(23)

Exemple 1

On veut mettre une chaîne de caractères en majuscules

On commence par créer une fonction qui met une chaîne de longueur 1 en majuscule.

Cela ne concerne que les lettres minuscules.

On manipule les unicodes correspondant.

Les lettres minuscules ont un code entre 97 et 97 + 26

La majuscule correspondant a un code diminué de 2

5

La fonction doit retourner une chaîne de longueur 1

(24)

Exemple 1

On veut mettre une chaîne de caractères en majuscules

On commence par créer une fonction qui met une chaîne de longueur 1 en majuscule.

Cela ne concerne que les lettres minuscules.

On manipule les unicodes correspondant.

Les lettres minuscules ont un code entre 97 et 97 + 26

La majuscule correspondant a un code diminué de 2

5

La fonction doit retourner une chaîne de longueur 1

(25)

Exemple 1

On veut mettre une chaîne de caractères en majuscules

On commence par créer une fonction qui met une chaîne de longueur 1 en majuscule.

Cela ne concerne que les lettres minuscules.

On manipule les unicodes correspondant.

Les lettres minuscules ont un code entre 97 et 97 + 26

La majuscule correspondant a un code diminué de 2

5

La fonction doit retourner une chaîne de longueur 1

(26)

Exemple 1

On veut mettre une chaîne de caractères en majuscules

On commence par créer une fonction qui met une chaîne de longueur 1 en majuscule.

Cela ne concerne que les lettres minuscules.

On manipule les unicodes correspondant.

Les lettres minuscules ont un code entre 97 et 97 + 26

La majuscule correspondant a un code diminué de 2

5

La fonction doit retourner une chaîne de longueur 1

(27)

Exemple 1

On veut mettre une chaîne de caractères en majuscules

On commence par créer une fonction qui met une chaîne de longueur 1 en majuscule.

Cela ne concerne que les lettres minuscules.

On manipule les unicodes correspondant.

Les lettres minuscules ont un code entre 97 et 97 + 26

La majuscule correspondant a un code diminué de 2

5

La fonction doit retourner une chaîne de longueur 1

(28)

In [62]: ?chr Docstring:

chr(i) -> Unicode character

Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.

Type: builtin_function_or_method

In [63]: ?ord Docstring:

ord(c) -> integer

Return the integer ordinal of a one-character string.

Type: builtin_function_or_method

Prelude Data.Char> :t chr chr :: Int -> Char

(29)

In [62]: ?chr Docstring:

chr(i) -> Unicode character

Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.

Type: builtin_function_or_method

In [63]: ?ord Docstring:

ord(c) -> integer

Return the integer ordinal of a one-character string.

Type: builtin_function_or_method

Prelude Data.Char> :t chr chr :: Int -> Char

(30)

In [62]: ?chr Docstring:

chr(i) -> Unicode character

Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.

Type: builtin_function_or_method

In [63]: ?ord Docstring:

ord(c) -> integer

Return the integer ordinal of a one-character string.

Type: builtin_function_or_method

Prelude Data.Char> :t chr chr :: Int -> Char

(31)

def car_en_maj(car) : ascii = ord(car)

if 97 <= ascii <= 97 + 26: return chr(ascii - 32) else :

return car

def car_en_maj(car) : ascii = ord(car)

if 97 <= ascii <= 97 + 26: return chr(ascii - 32) return car

(32)

def car_en_maj(car) : ascii = ord(car)

if 97 <= ascii <= 97 + 26: return chr(ascii - 32) else :

return car

def car_en_maj(car) : ascii = ord(car)

if 97 <= ascii <= 97 + 26: return chr(ascii - 32) return car

(33)

Sommaire

1 Fonctions pures 2 Fonctions impures 3 lambda expressions

4 Composition 5 Récursion

6 Raisonnement par récurrence

(34)

Print

Et pourquoi pas print ?

ord prend un argument de type string , retourne un argument de type int ET NE FAIT QUE ÇA.

C’est une fonction PURE

(35)

Print

Et pourquoi pas print ?

ord prend un argument de type string , retourne un argument de type int ET NE FAIT QUE ÇA.

C’est une fonction PURE

(36)

Print

Et pourquoi pas print ?

ord prend un argument de type string , retourne un argument de type int ET NE FAIT QUE ÇA.

C’est une fonction PURE

(37)

Print

Et pourquoi pas print ?

ord prend un argument de type string , retourne un argument de type int ET NE FAIT QUE ÇA.

C’est une fonction PURE

(38)
(39)

Print

In [34]: type(print(2)) 2

Out[34]: NoneType In [35]: print(print(2)) 2

None

In [36]: print(print(2),print(’GNU’)) 2

GNU None None

(40)

In [37]: [ print(a) for a in range(5) ] 0

1 2 3 4

Out[37]: [None, None, None, None, None]

(41)

In [38]: b = [ print(a) for a in range(5) ] 0

1 2 3 4

In [39]: b

Out[39]: [None, None, None, None, None]

print est IMPURE !

(42)

In [38]: b = [ print(a) for a in range(5) ] 0

1 2 3 4

In [39]: b

Out[39]: [None, None, None, None, None]

print est IMPURE !

(43)
(44)

print renvoie toujours None mais a un EFFET SECONDAIRE ( side

effect ) qui affiche quelque chose dans le monde extérieur.

(45)

def plus_chaine(x) : global a

return x + ’ ’ + a

(46)

In [102]: a = ’Dave’

In [103]: plus_chaine(’Bonjour’) Out[103]: ’Bonjour Dave’

In [104]: a = ’HAL’

In [105]: plus_chaine(’Bonjour’) Out[105]: ’Bonjour HAL’

(47)

In [102]: a = ’Dave’

In [103]: plus_chaine(’Bonjour’) Out[103]: ’Bonjour Dave’

In [104]: a = ’HAL’

In [105]: plus_chaine(’Bonjour’) Out[105]: ’Bonjour HAL’

(48)
(49)
(50)
(51)

Sommaire

1 Fonctions pures 2 Fonctions impures 3 lambda expressions

4 Composition 5 Récursion

6 Raisonnement par récurrence

(52)

Les fonctions sont des expressions comme les autres.

(53)

def transforme_une_lettre(transformation, lettre) : return transformation(lettre)

In [119]: transforme_une_lettre(car_en_maj, ’g’) Out[119]: ’G’

def cesar(lettre) :

return chr( ord(lettre) + 3 )

In [120]: transforme_une_lettre(cesar, ’g’) Out[120]: ’j’

(54)

def transforme_une_lettre(transformation, lettre) : return transformation(lettre)

In [119]: transforme_une_lettre(car_en_maj, ’g’) Out[119]: ’G’

def cesar(lettre) :

return chr( ord(lettre) + 3 )

In [120]: transforme_une_lettre(cesar, ’g’) Out[120]: ’j’

(55)

def transforme_une_lettre(transformation, lettre) : return transformation(lettre)

In [119]: transforme_une_lettre(car_en_maj, ’g’) Out[119]: ’G’

def cesar(lettre) :

return chr( ord(lettre) + 3 )

In [120]: transforme_une_lettre(cesar, ’g’) Out[120]: ’j’

(56)

def transforme_une_lettre(transformation, lettre) : return transformation(lettre)

In [119]: transforme_une_lettre(car_en_maj, ’g’) Out[119]: ’G’

def cesar(lettre) :

return chr( ord(lettre) + 3 )

In [120]: transforme_une_lettre(cesar, ’g’) Out[120]: ’j’

(57)

λ -expressions

(58)

x ↦ 2 x + 1

λx ⋅ 2 x + 1

lambda x : 2*x + 1

"Une fonction qui prend x et retourne 2*x + 1"

In [121]: (lambda x : 2*x + 1)(5) Out[121]: 11

(59)

x ↦ 2 x + 1

λx ⋅ 2 x + 1

lambda x : 2*x + 1

"Une fonction qui prend x et retourne 2*x + 1"

In [121]: (lambda x : 2*x + 1)(5) Out[121]: 11

(60)

x ↦ 2 x + 1

λx ⋅ 2 x + 1

lambda x : 2*x + 1

"Une fonction qui prend x et retourne 2*x + 1"

In [121]: (lambda x : 2*x + 1)(5) Out[121]: 11

(61)

x ↦ 2 x + 1

λx ⋅ 2 x + 1

lambda x : 2*x + 1

"Une fonction qui prend x et retourne 2*x + 1"

In [121]: (lambda x : 2*x + 1)(5) Out[121]: 11

(62)

In [1]: transforme_une_lettre(lambda c : chr( ord(c) + 5 ), ’a’) Out[1]: ’f’

(63)

def cesar(decalage) :

return lambda lettre : chr( ord(lettre) + decalage )

In [127]: cesar(3)

Out[127]: <function __main__.cesar.<locals>.<lambda>>

In [128]: cesar(3)(’a’) Out[128]: ’d’

In [129]: cesar(5)(’a’) Out[129]: ’f’

(64)

def cesar(decalage) :

return lambda lettre : chr( ord(lettre) + decalage )

In [127]: cesar(3)

Out[127]: <function __main__.cesar.<locals>.<lambda>>

In [128]: cesar(3)(’a’) Out[128]: ’d’

In [129]: cesar(5)(’a’) Out[129]: ’f’

(65)

def cesar(decalage) :

return lambda lettre : chr( ord(lettre) + decalage )

In [127]: cesar(3)

Out[127]: <function __main__.cesar.<locals>.<lambda>>

In [128]: cesar(3)(’a’) Out[128]: ’d’

In [129]: cesar(5)(’a’) Out[129]: ’f’

(66)

Sommaire

1 Fonctions pures 2 Fonctions impures 3 lambda expressions

4 Composition 5 Récursion

6 Raisonnement par récurrence

(67)

Composition de fonctions

Défi ISI n

o

1 :

On attendra dimanche 27 septembre ;-)

(68)

Dans un vrai langage de programmation :

(.) :: (b ->c) -> (a -> b)-> a -> c f . g = \x -> f (g x)

(69)

Défi

Écrire une fonction qui renvoie la longueur du mot le plus long d’une chaîne de caractères donnée en argument.

In [1]: long_mot_plus_long("Vos beaux yeux d’amour mourir me font Belle Marquise")

Out[1]: 8

(70)

Il faudrait une fonction qui éclate la phrase en liste de mots

Il faudrait une fonction qui renvoie la liste des longueurs de ces mots

Il faudrait une fonction qui calcule le maximum des éléments d’une liste

(71)

Il faudrait une fonction qui éclate la phrase en liste de mots

Il faudrait une fonction qui renvoie la liste des longueurs de ces mots

Il faudrait une fonction qui calcule le maximum des éléments d’une liste

(72)

Il faudrait une fonction qui éclate la phrase en liste de mots

Il faudrait une fonction qui renvoie la liste des longueurs de ces mots

Il faudrait une fonction qui calcule le maximum des éléments d’une liste

(73)

String Ð

eclate

ÐÐÐ → [ String ] ÐÐÐÐÐ→ [

longueurs

Int ] ÐÐÐÐ→

maximum

Int

sÐÐÐ→eclate eclate s

longueurs

ÐÐÐÐÐ→longueurs(eclate s)ÐÐÐÐ→maximum maximum(longueurs(eclate s))

String Ð

maximum

ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ

longueurs eclate

Int

String ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ→

eclatelongueurs maximum

Int

(74)

String Ð

eclate

ÐÐÐ → [ String ] ÐÐÐÐÐ→ [

longueurs

Int ] ÐÐÐÐ→

maximum

Int

sÐÐÐ→eclate eclate s

longueurs

ÐÐÐÐÐ→longueurs(eclate s)ÐÐÐÐ→maximum maximum(longueurs(eclate s))

String Ð

maximum

ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ

longueurs eclate

Int

String ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ→

eclatelongueurs maximum

Int

(75)

String Ð

eclate

ÐÐÐ → [ String ] ÐÐÐÐÐ→ [

longueurs

Int ] ÐÐÐÐ→

maximum

Int

sÐÐÐ→eclate eclate s

longueurs

ÐÐÐÐÐ→longueurs(eclate s)ÐÐÐÐ→maximum maximum(longueurs(eclate s))

String Ð

maximum

ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ

longueurs eclate

Int

String ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ→

eclatelongueurs maximum

Int

(76)

String Ð

eclate

ÐÐÐ → [ String ] ÐÐÐÐÐ→ [

longueurs

Int ] ÐÐÐÐ→

maximum

Int

sÐÐÐ→eclate eclate s

longueurs

ÐÐÐÐÐ→longueurs(eclate s)ÐÐÐÐ→maximum maximum(longueurs(eclate s))

String Ð

maximum

ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ

longueurs eclate

Int

String ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ→

eclatelongueurs maximum

Int

(77)

def long_mot_plus_long(cs) :

return maximum( longueurs( eclate( cs ) ) )

(78)

In [14]: eclate("Vos beaux yeux") Out[14]: [’Vos’, ’beaux’, ’yeux’]

def eclate(chaine) : return chaine.split()

(79)

In [14]: eclate("Vos beaux yeux") Out[14]: [’Vos’, ’beaux’, ’yeux’]

def eclate(chaine) : return chaine.split()

(80)

In [15]: longueurs([’Vos’, ’beaux’, ’yeux’]) Out[15]: [3, 5, 4]

def longueurs(xs) :

return [ len(x) for x in xs ]

(81)

In [15]: longueurs([’Vos’, ’beaux’, ’yeux’]) Out[15]: [3, 5, 4]

def longueurs(xs) :

return [ len(x) for x in xs ]

(82)

def maximum(xs) : maxi = xs[0]

for elmt in xs[1:] : if elmt > maxi : maxi = elmt return maxi

(83)

def eclate(chaine) : return chaine.split() def longueurs(xs) :

return [ len(x) for x in xs ] def maximum(xs) :

maxi = xs[0]

for elmt in xs[1:] : if elmt > maxi : maxi = elmt return maxi

def long_mot_plus_long(cs) :

return maximum(longueurs(eclate(cs)))

(84)

def compose2(f,g) :

return lambda x: f(g(x))

compose2 = lambda f,g : lambda x : f(g(x))

In [28]: compose2(longueurs,eclate)("un deux trois") Out[28]: [2, 4, 5]

long_mot_plus_long = compose2( maximum, compose2(longueurs, eclate) )

(85)

def compose2(f,g) :

return lambda x: f(g(x))

compose2 = lambda f,g : lambda x : f(g(x))

In [28]: compose2(longueurs,eclate)("un deux trois") Out[28]: [2, 4, 5]

long_mot_plus_long = compose2( maximum, compose2(longueurs, eclate) )

(86)

def compose2(f,g) :

return lambda x: f(g(x))

compose2 = lambda f,g : lambda x : f(g(x))

In [28]: compose2(longueurs,eclate)("un deux trois") Out[28]: [2, 4, 5]

long_mot_plus_long = compose2( maximum, compose2(longueurs, eclate) )

(87)

def compose2(f,g) :

return lambda x: f(g(x))

compose2 = lambda f,g : lambda x : f(g(x))

In [28]: compose2(longueurs,eclate)("un deux trois") Out[28]: [2, 4, 5]

long_mot_plus_long = compose2( maximum, compose2(longueurs, eclate) )

(88)

Sommaire

1 Fonctions pures 2 Fonctions impures 3 lambda expressions

4 Composition 5 Récursion

6 Raisonnement par récurrence

(89)
(90)
(91)
(92)
(93)
(94)
(95)
(96)
(97)
(98)
(99)
(100)
(101)
(102)
(103)
(104)
(105)
(106)
(107)
(108)
(109)
(110)
(111)
(112)
(113)
(114)
(115)
(116)
(117)
(118)

induction

induction mathématique (raisonnement par récurrence)

fonction récurive et type récursif

(119)

induction

induction mathématique (raisonnement par récurrence)

fonction récurive et type récursif

(120)

induction

induction mathématique (raisonnement par récurrence)

fonction récurive et type récursif

(121)

Le retour de Max

(122)

def max2(a,b) :

return a if a >= b else b

def maxi(xs) :

assert xs != [], "Liste vide !"

if len(xs) == 1 : return xs[0]

return max2( xs[0], maxi(xs[1:]) )

(123)

def max2(a,b) :

return a if a >= b else b

def maxi(xs) :

assert xs != [], "Liste vide !"

if len(xs) == 1 : return xs[0]

return max2( xs[0], maxi(xs[1:]) )

(124)

In [54]: maxi("agfdjuol") maxi <- (’agfdjuol’,)

maxi <- (’gfdjuol’,) maxi <- (’fdjuol’,) maxi <- (’djuol’,) maxi <- (’juol’,) maxi <- (’uol’,) maxi <- (’ol’,) maxi <- (’l’,) maxi -> l maxi -> o maxi -> u maxi -> u maxi -> u maxi -> u maxi -> u maxi -> u Out[54]: ’u’

(125)

a

n

= a × a × ⋯ × a

´ ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¶

nfacteursa

⋯ ???

a

0

= 1, a

n

= a × a

n−1

(126)

a

n

= a × a × ⋯ × a

´ ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¶

nfacteursa

⋯ ???

a

0

= 1, a

n

= a × a

n−1

(127)

a

n

= a × a × ⋯ × a

´ ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¶

nfacteursa

⋯ ???

a

0

= 1, a

n

= a × a

n−1

(128)

a

n

= a × a × ⋯ × a

´ ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¶

nfacteursa

⋯ ???

a

0

= 1, a

n

= a × a

n−1

(129)

def pow1(a, n) :

assert n >= 0, "L’exposant doit être entier naturel"

if n == 0 : return 1 else :

return a * pow1(a, n - 1)

(130)

pow1(2, 3) 2 * pow1(2, 2)

2 * (2 * pow1(2, 1))

2 * (2 * (2 * pow1(2 , 0))) 2* (2 * (2 * 1))

2 * (2 * 2) 2 * 4

8

Expansion Réduction

(131)

pow1(2, 3) 2 * pow1(2, 2)

2 * (2 * pow1(2, 1))

2 * (2 * (2 * pow1(2 , 0))) 2* (2 * (2 * 1))

2 * (2 * 2) 2 * 4

8

Expansion Réduction

(132)

pow1(2, 3) 2 * pow1(2, 2)

2 * (2 * pow1(2, 1))

2 * (2 * (2 * pow1(2 , 0))) 2* (2 * (2 * 1))

2 * (2 * 2) 2 * 4

8

Expansion Réduction

(133)

pow1(2, 3) 2 * pow1(2, 2)

2 * (2 * pow1(2, 1))

2 * (2 * (2 * pow1(2 , 0))) 2* (2 * (2 * 1))

2 * (2 * 2) 2 * 4

8

Expansion Réduction

(134)

pow1(2, 3) 2 * pow1(2, 2)

2 * (2 * pow1(2, 1))

2 * (2 * (2 * pow1(2 , 0))) 2* (2 * (2 * 1))

2 * (2 * 2) 2 * 4

8

Expansion Réduction

(135)

pow1(2, 3) 2 * pow1(2, 2)

2 * (2 * pow1(2, 1))

2 * (2 * (2 * pow1(2 , 0))) 2* (2 * (2 * 1))

2 * (2 * 2) 2 * 4

8

Expansion Réduction

(136)

pow1(2, 3) 2 * pow1(2, 2)

2 * (2 * pow1(2, 1))

2 * (2 * (2 * pow1(2 , 0))) 2* (2 * (2 * 1))

2 * (2 * 2) 2 * 4

8

Expansion Réduction

(137)

pow1(2, 3) 2 * pow1(2, 2)

2 * (2 * pow1(2, 1))

2 * (2 * (2 * pow1(2 , 0))) 2* (2 * (2 * 1))

2 * (2 * 2) 2 * 4

8

Expansion Réduction

(138)

pow1(2, 3) 2 * pow1(2, 2)

2 * (2 * pow1(2, 1))

2 * (2 * (2 * pow1(2 , 0))) 2* (2 * (2 * 1))

2 * (2 * 2) 2 * 4

8

Expansion Réduction

(139)

pow1(2, 3) 2 * pow1(2, 2)

2 * (2 * pow1(2, 1))

2 * (2 * (2 * pow1(2 , 0))) 2* (2 * (2 * 1))

2 * (2 * 2) 2 * 4

8

Expansion Réduction

(140)

def pow2(a, n) :

assert n >= 0, "L’exposant doit être entier naturel"

def accumule(k, acc) : if k == 0 :

return acc else :

return accumule(k - 1, a*acc) return accumule(n, 1)

(141)

pow2(2, 3)

accumule(3, 1)

accumule(2, 2)

accumule(1,4)

accumule(0,8)

8

(142)

pow2(2, 3)

accumule(3, 1)

accumule(2, 2)

accumule(1,4)

accumule(0,8)

8

(143)

pow2(2, 3)

accumule(3, 1)

accumule(2, 2)

accumule(1,4)

accumule(0,8)

8

(144)

pow2(2, 3)

accumule(3, 1)

accumule(2, 2)

accumule(1,4)

accumule(0,8)

8

(145)

pow2(2, 3)

accumule(3, 1)

accumule(2, 2)

accumule(1,4)

accumule(0,8)

8

(146)

pow2(2, 3)

accumule(3, 1)

accumule(2, 2)

accumule(1,4)

accumule(0,8)

8

(147)
(148)

In [24]: pow1(2,3) pow1 <- (2, 3)

pow1 <- (2, 2) pow1 <- (2, 1)

pow1 <- (2, 0) pow1 -> 1 pow1 -> 2 pow1 -> 4 pow1 -> 8 Out[24]: 8

(149)

In [27]: pow2(2,3) pow2 <- (2, 3) accumule <- (3, 1)

accumule <- (2, 2) accumule <- (1, 4)

accumule <- (0, 8) accumule -> 8 accumule -> 8 accumule -> 8 accumule -> 8 pow2 -> 8 Out[27]: 8

(150)
(151)

def pow3(a, n) :

assert n >= 0, "L’exposant doit être entier naturel"

accu = 1 k = 0

while k < n : accu *= a k += 1 return accu

(152)

def pow4(a, n) :

assert n >= 0, "L’exposant doit être un entier naturel"

accu = 1

for k inrange(n) : accu = a*accu return accu

(153)

from functools import reduce def pow5(a, n):

return reduce(lambda accu, k : a*accu, range(n), 1)

(154)
(155)

Le secret de la réduction

(156)

Le secret de la réduction

f ( f ( f (⋯ f ( f ( accu 0 , x

0

) , x

1

)⋯) , x

n−1

) , x

n

)

def reduit(f, xs, accu0) : accu = accu0

for x inxs :

accu = f(accu, x) return accu

reduce(f, xs, accu0)

(157)

Le secret de la réduction

f ( f ( f (⋯ f ( f ( accu 0 , x

0

) , x

1

)⋯) , x

n−1

) , x

n

)

def reduit(f, xs, accu0) : accu = accu0

for x inxs :

accu = f(accu, x) return accu

reduce(f, xs, accu0)

(158)

Le secret de la réduction

f ( f ( f (⋯ f ( f ( accu 0 , x

0

) , x

1

)⋯) , x

n−1

) , x

n

)

def reduit(f, xs, accu0) : accu = accu0

for x inxs :

accu = f(accu, x) return accu

reduce(f, xs, accu0)

(159)

Le retour de Max

(160)

maxi = lambda xs: reduce(lambda max_tmp, x: xif x > max_tmp else max_tmp, xs)

max2 = lambda a, b: a if a >= b else b maxi = lambda xs: reduce(max2, xs)

def max2(a,b) :

return a if a >= b else b def maxi(xs) :

return reduce(max2, xs)

(161)

maxi = lambda xs: reduce(lambda max_tmp, x: xif x > max_tmp else max_tmp, xs)

max2 = lambda a, b: a if a >= b else b maxi = lambda xs: reduce(max2, xs)

def max2(a,b) :

return a if a >= b else b def maxi(xs) :

return reduce(max2, xs)

(162)

maxi = lambda xs: reduce(lambda max_tmp, x: xif x > max_tmp else max_tmp, xs)

max2 = lambda a, b: a if a >= b else b maxi = lambda xs: reduce(max2, xs)

def max2(a,b) :

return a if a >= b else b def maxi(xs) :

return reduce(max2, xs)

(163)

In [23]: maxi([1,12,5,47,86,9,4]) Out[23]: 86

In [24]: maxi([])

TypeError: reduce() of empty sequence with no initial value

(164)

Défi

Construisez une fonction prend une liste d’entiers et renvoie le produit des carrés des nombres pairs de cette liste. Une réponse en une petite ligne serait appréciée...

Défi

Construisez une fonction compose qui renvoie la composée d’une suite de fonctions :

In [35]: compose(maximum,longueurs,eclate)("Trois deux un") Out[35]: 5

(165)

Défi

Construisez une fonction prend une liste d’entiers et renvoie le produit des carrés des nombres pairs de cette liste. Une réponse en une petite ligne serait appréciée...

Défi

Construisez une fonction compose qui renvoie la composée d’une suite de fonctions :

In [35]: compose(maximum,longueurs,eclate)("Trois deux un") Out[35]: 5

(166)

In [29]: %timeit pow5(17,100)

100000 loops, best of 3: 12.3 µs per loop In [30]: %timeit pow4(17,100)

100000 loops, best of 3: 6.67 µs per loop In [31]: %timeit pow3(17,100)

100000 loops, best of 3: 9.24 µs per loop In [32]: %timeit pow2(17,100)

10000 loops, best of 3: 18.6 µs per loop In [33]: %timeit pow1(17,100)

10000 loops, best of 3: 17.8 µs per loop

(167)

def pow6(a, n):

if n == 0 : return 1 if n == 1 :

return a if n % 2 == 0 :

return pow6(a*a, n//2) return a * pow6(a, n-1)

In [42]: %timeit pow6(17,100)

100000 loops, best of 3: 2.35 µs per loop

(168)

def pow6(a, n):

if n == 0 : return 1 if n == 1 :

return a if n % 2 == 0 :

return pow6(a*a, n//2) return a * pow6(a, n-1)

In [42]: %timeit pow6(17,100)

100000 loops, best of 3: 2.35 µs per loop

(169)

In [45]: pow6(2,10) pow6 <- (2, 10)

pow6 <- (4, 5) pow6 <- (4, 4)

pow6 <- (16, 2) pow6 <- (256, 1) pow6 -> 256 pow6 -> 256 pow6 -> 256 pow6 -> 1024 pow6 -> 1024 Out[45]: 1024

(170)

Défi

Dérécursifiez la fonction pow6

(171)
(172)

OCaml

let rec pow a = function

| 1 -> 1

| n -> a * (pow a (n - 1)) ;;

let powt a n =

let rec pow_iter acc k = if k == 0 then acc

else pow_iter (a*acc) (k-1) inpow_iter 1 n ;;

(173)

# pow 17 100_000;;

Stack overflow during evaluation (looping recursion?).

# powt 17 100_000;;

- : int = -573761023

(174)

Sommaire

1 Fonctions pures 2 Fonctions impures 3 lambda expressions

4 Composition 5 Récursion

6 Raisonnement par récurrence

(175)

Pour prouver qu’une propriété P

n

dépendant uniquement d’un paramètre n est vraie pour tout n ⩾ n

0

, il faut vérifier que :

P

n0

est vraie (on parle parfois d’initialisation) ;

pour tout n ⩾ n

0

, P

n

→ P

n+1

(on parle parfois d’hérédité).

(176)

Pour prouver qu’une propriété P

n

dépendant uniquement d’un paramètre n est vraie pour tout n ⩾ n

0

, il faut vérifier que :

P

n0

est vraie (on parle parfois d’initialisation) ;

pour tout n ⩾ n

0

, P

n

→ P

n+1

(on parle parfois d’hérédité).

(177)

Tours de Hanoi – 1 Disque

1

(178)

Tours de Hanoi – 1 Disque

1

On déplace le disque de la tige 1 vers la tige 3.

(179)

Tours de Hanoi – 1 Disque

1

OK

(180)

Tours de Hanoi – 2 Disques

2

1

(181)

Tours de Hanoi – 2 Disques

2 1

On déplace le disque de la tige 1 vers la tige 2.

(182)

Tours de Hanoi – 2 Disques

1 2

On déplace le disque de la tige 1 vers la tige 3.

(183)

Tours de Hanoi – 2 Disques

2 1

On déplace le disque de la tige 2 vers la tige 3.

(184)

Tours de Hanoi – 2 Disques

2 1

OK

(185)

Tours de Hanoi – 3 Disques

3

2

1

(186)

Tours de Hanoi – 3 Disques

3 2

1

On déplace le disque de la tige 1 vers la tige 3.

(187)

Tours de Hanoi – 3 Disques

3 2 1

On déplace le disque de la tige 1 vers la tige 2.

(188)

Tours de Hanoi – 3 Disques

3 2

1

On déplace le disque de la tige 3 vers la tige 2.

(189)

Tours de Hanoi – 3 Disques

2 1

3

On déplace le disque de la tige 1 vers la tige 3.

(190)

Tours de Hanoi – 3 Disques

1 2 3

On déplace le disque de la tige 2 vers la tige 1.

(191)

Tours de Hanoi – 3 Disques

1 3

2

On déplace le disque de la tige 2 vers la tige 3.

(192)

Tours de Hanoi – 3 Disques

3 2 1

On déplace le disque de la tige 1 vers la tige 3.

(193)

Tours de Hanoi – 3 Disques

3 2

OK 1

(194)

Tours de Hanoi – 4 Disques

4

3

2

1

(195)

Tours de Hanoi – 4 Disques

4 3 2

1

On déplace le disque de la tige 1 vers la tige 2.

(196)

Tours de Hanoi – 4 Disques

4 3

1 2

On déplace le disque de la tige 1 vers la tige 3.

(197)

Tours de Hanoi – 4 Disques

4 3

2 1

On déplace le disque de la tige 2 vers la tige 3.

(198)

Tours de Hanoi – 4 Disques

4 3 2

1

On déplace le disque de la tige 1 vers la tige 2.

(199)

Tours de Hanoi – 4 Disques

4 1

3 2

On déplace le disque de la tige 3 vers la tige 1.

(200)

Tours de Hanoi – 4 Disques

4 1

3 2

On déplace le disque de la tige 3 vers la tige 2.

Références

Documents relatifs

Voyons une illustration du fonctionnement des cônes avec une illusion d’optique colorée Explication : après avoir fixée les zones colorées vertes les cônes capteurs de lumière

On se ramène facilement au cas d'un domaine fin et régulier U ( 2 ). Toute minorante finement sousharmonique de q dans V est finement continue selon [2, Theorem 9.10] et ^ q dans

[r]

C’est donc une partie (sous-ensemble) de DOMAINE ⊗ CODOMAINE ...mais il n’y a pas deux couples ayant le même premier élément.. 4

En fonction de votre réponse, déterminer la relation de dispersion pour une OPPH dans le métal.. On est donc dans le cas où il n’y a pas

Pour chacune des fonctions suivantes, construire le tableau de variation relatif à f’ et à f’’, donner une esquisse du graphique de la fonction.. f’(x) non

Ecris en l’air le mot choisi par ton voisin et avance d’autant de cases que de lettres dans.

[r]