Hola. Ya hemos visto varios tipos de instrucciones condicionales, así que estamos listos para explorar varias soluciones a un problema y comparar algunas ventajas y desventajas. En este caso vamos a escribir una función que reciba por parámetro cuatro números enteros y va a retornar el mayor de estos, teniendo en cuenta que si hay dos o más mayores, puede retornar cualquiera. Es decir, si tenemos los números 3, 5, 5 y 2, nuestra función puede retornar el primer 5 o el segundo 5 de manera indiferente. Antes de empezar a escribir la función, pensemos qué tipo de problema es. ¿Son casos excluyentes?, es decir, ¿si se cumple una condición los demás casos no se van a cumplir? O en otras palabras, ¿necesitamos un condicional en cascada? O por el contrario, nos enfrentamos a casos no excluyentes y, por lo tanto, debemos recurrir a condicionales independientes. En esta oportunidad contestaremos juntos estas preguntas. Pensemos en si podemos modelar casos excluyentes y, la respuesta es sí. Supongamos que podemos plantear un caso en el que a sea mayor que b y a también sea mayor que c y también mayor que d. Si esto se cumple, ninguna otra posibilidad será viable, entonces podemos plantear el resto de condicionales de la cascada. Veamos nuestra primera solución siguiendo la estrategia que acabamos de plantear. La condición del "if" modela exactamente el caso que identificamos y, el primer "elif" hace lo mismo, pero asumiendo que b es el mayor. El siguiente "elif" igual, pero asumiendo que c es el mayor. Y el "else" no necesita condición porque la única alternativa que nos queda es que d sea el mayor. Detengámonos en dos aspectos importantes de este algoritmo. Primero, pensemos que no tengo cuatro números, sino 30. Por ejemplo, quiero saber qué estudiante tiene el mejor promedio de la clase y mi curso perfectamente podría tener 30 personas. ¿Se imaginan las condiciones lo largas que serían y la facilidad con la que podríamos cometer un error? Mi segunda preocupación, que por ahora les podrá parecer capricho, pero que con seguridad les ahorrará inconvenientes en los módulos que vienen del curso y, en general cuando estén programando, es que esta solución tiene varias instrucciones "return". Sin embargo, recordemos que esta instrucción al ejecutarse corta el flujo en la función, es decir, las líneas de código que hay después de un "return" que se ejecute, simplemente no van a existir. En este caso, no es un problema, pero en general es mucho más elegante garantizar que las funciones solo tienen un "return" y que es la última línea de la función. Así no corremos el riesgo de no evaluar casos que se requieran y en general de perder instrucciones por cortar el flujo en cualquier punto diferente al final. La segunda solución justamente aborda esta última preocupación. Noten que ahora tenemos una variable "respuesta" donde de acuerdo con la condición que se cumpla, vamos guardando lo que vamos a retornar. En este caso si se cumple que a es el número mayor, a respuesta le asignamos el valor de a y tal como lo había descrito la última línea de la función, la 21, es donde retornamos el valor de la variable. Por supuesto, obtenemos los mismos resultados para los mismos argumentos porque las soluciones son equivalentes, solo que esta es mucho más elegante. Sin embargo, aún tenemos pendiente cómo solucionar este problema cuando tenemos mucho más que cuatro números, es decir, como podemos generalizar nuestro algoritmo. Qué tal si en lugar de escribir casos excluyentes, simplemente supongo que el primer número es el mayor y lo guardo en una variable que voy a retornar al final. Luego, caso a caso verifico si ese mayor es menor que el siguiente número y, si lo es, actualizo el valor de mi variable. Si no, simplemente no hago nada y hago la comparación con el siguiente número hasta que haya revisado tantos números como tenga. Esta estrategia tiene varios aspectos interesantes. Primero, necesitamos condicionales independientes porque el primer número podría ser el mayor, pero también podría ser el segundo, el tercero o el último. Así que no podemos modelar casos excluyentes. Además, simplificamos muchísimo la condición de cada caso, porque simplemente hacemos una comparación entre dos números. Noten que inicializamos la variable mayor con el valor de a. Luego, comparamos si b es mayor que "mayor" y si lo es, actualizamos el valor de la variable con el valor de b. Lo mismo hacemos para c y para d y al final tendremos el mayor, el valor del número mayor. Noten que las condiciones verifican que sea mayor estricto, eso quiere decir que para el ejemplo de los números 3, 5, 5 y 2 retornaremos b, el segundo 5. Si quisiéramos retornar el último valor mayor, tendríamos que cambiar las condiciones a mayor igual; y así en el caso del segundo 5 se cumpliría la condición y "mayor" se actualizaría con ese segundo 5. Tal vez en este caso no es tan importante, pero si tengo que retornar el primero de la lista con el mayor promedio, primero en el sentido de orden alfabético de los apellidos, definitivamente nos interesa entender que la condición es estrictamente mayor. Este algoritmo de búsqueda lo utilizaremos muchísimo, así que es muy importante asegurarse de haberlo apropiado correctamente. Por último, es claro que si tengo 30 números, aunque hayamos simplificado la condición de cada caso, sigue siendo muy dispendioso resolver el problema. Y aquí tengo una buena y una mala noticia. Primero les doy la mala: por ahora no tenemos ninguna otra alternativa, tendremos que escribir todos los casos uno a uno. La buena noticia, es que con Marcela aprenderán otro tipo de instrucciones con las que ya no tendrán este problema.