Feu una funció maximitzador(f) que, donada una funció com a paràmetre (anomenem-la f; suposarem que aquesta funció f rep un nombre i retorna un nombre), retorni una altra funció.
Aquesta funció retornada ha de ser una funció tal que, després de n−1 invocacions amb paràmetres x1,…,xn−1, quan s’invoca amb paràmetre xn escrigui al stdout el màxim dels f(xi) trobats fins el moment (és a dir, el màxim de f(x1),…,f(xn) per a tots els xi amb que aquesta funció, retornada per maximitzador(f), ha estat invocada).
Entrada
La funció maximitzador(f) té un paràmetre: Una funció que, donat un nombre, retorna un nombre.
Sortida
La funció maximitzador(f) retorna una funció com la descrita a l’enunciat.
Observacions
Fixeu-vos que la funció retornada per maximitzador(f) ha d’escriure el màxim de f(x1),…,f(xn) per a tots els xi amb que aquesta funció, retornada per maximitzador(f), ha estat invocada, i ha de retornar una funció que continuï fent el que demana l’enunciat. Aquesta funció retornada per maximitzador(f) ha de fer les dues coses, escriure i retornar.
No podeu utilitzar cap llista, diccionari, conjunt o cap altra estructura de dades. Només nombres i funcions.
En aquest problema només cal que envieu un fitxer amb la funció demanada, sense cap codi addicional.
Un cop definida la funció, en provar-la al REPL de Python us hauria de sortir el mateix que podeu observar més avall.
>>> import math >>> quadrat = lambda x: x*x >>> cosinus = math.cos >>> >>> h = maximitzador(quadrat) >>> h = h(2) 4 >>> h = h(3) 9 >>> h = h(2) 9 >>> h = h(1) 9 >>> h = h(5) 25 >>> h = h(3) 25 >>> >>> # També podem fer-ho així, més compacte: >>> h = maximitzador(quadrat) >>> h = h(2)(3)(2)(1)(5)(3) 4 9 9 9 25 25 >>> # o, directament (ara amb la funció abs): >>> h = maximitzador(abs)(2)(1)(3)(2)(-4) 2 2 3 3 4 >>> # finalment, provem-ho amb el cosinus: >>> h = maximitzador(cosinus)(math.pi)(math.pi/2)(4.2)(0.1)(math.pi/3)(math.pi/4) -1.0 6.123233995736766e-17 6.123233995736766e-17 0.9950041652780258 0.9950041652780258 0.9950041652780258 >>>