Práctico 3 Ejercicio 10

Práctico 3 Ejercicio 10

de Josefina Perez Curbelo -
Número de respuestas: 2

Buenos días, no logro entender cuando es necesario usar el && ya que dice la letra que los números en el vector están ordenados de forma ascendente, asi que a no ser que todos los números sean negativos una vez que se llegué al primer número mayor o igual que cero ya no quedarán más números negativos. Y en ese caso no veo necesaria la correción ya que igual con un solo & va a revisar cada una de las entradas hasta i=n

En respuesta a Josefina Perez Curbelo

Re: Práctico 3 Ejercicio 10

de Eduardo Fernandez -

Hola Josefina,

Vamos a ir despacio en esto porque viene con curva. 
Si hacés lo siguiente en Octave:

>> v=[3 4 5], n=length(v), i=4
v =
   3   4   5
n = 3
i = 4 y si luego ejecutás:
>> i<=n & v(i)<0
Te devuelve el mensaje de error siguiente
error: v(4): out of bound 3 (dimensions are 1x3)
¿Por qué? Porque v(i) no existe, v tiene sólo 3 elementos y i vale 4. Se evalúan ambos lados del & y cancela al tratar de encontrar v(i).

Por otra parte si hacés

>> i<=n  &&  v(i)<0

El resultado es 

ans = 0

¿Por qué? porque la primera expresión lógica (i<=n) es falsa y por el && no se evalúa la 2da expresión lógica (v(i)<0). Ya sabe que si (i<=n) es falso entonces, haya lo que haya a la derecha del &&, va a dar falso, entonces ni intenta evaluar (v(i)<0). Es una evaluación perezosa o lazy, o también se dice que && es un "short circuit boolean operator", o un operador de circuito corto. Esto trae como ventaja que se evita la cancelación de la expresión (v(i)<0) cuando i es mayor de lo permitido. 

Entonces, la idea es que yendo de izquierda a derecha en las expresiones lógicas, primero pongas expresiones lógicas que controlen y eviten que las siguientes expresiones lógicas cancelen.  En este caso, el poner (i<=n) a la izquierda, y poner &&, evita que evaluemos (v(i)<0) cuando i>n.

Dicho todo esto, en Octave pasa algo más (!!). Cuando esa expresión lógica está en un WHILE o un IF y tiene un &, lo interpreta siempre como &&, pero además te avisa que hizo eso. Te pone un mensaje de warning avisándote. 
Por ejemplo en el Ejercicio 10 pone: 

>> pr3ej10
warning: Matlab-style short-circuit operation performed for operator &
warning: called from
    pr3ej10 at line 4 column 12

En ese warning te avisa lo que está ocurriendo. En lugar de & va a usar un operador de circuito corto (&&).
Si ahora tomas el código del ejercicio 10, y en lugar de & ponés &&, vas a ver que ejecuta y no aparece ningún warning.


Conclusión: en Octave en los if y while, los & y | se sustituyen por && y ||, y avisa que hace eso poniendo un warning, o sea que van
a funcionar de igual forma, con la diferencia que te va a poner un warning avisándote del cambio.

Por último, ¡¡algo importante!!

En los parciales y exámenes vamos a pedirles que pongan explícitamente && y || si es necesario que haga la operación perezosa para que el 
código no cancele. Queremos que lo pongan y que no asuman que como Octave lo hace nosotros vamos a evaluar como que ustedes ya saben
lo que hace Octave.
Espero que esto aclare un poco el tema de estos operadores. Esto lo explicamos en el teórico y en los prácticos, pero no viene mal aclararlo
nuevamente aquí también.

saludos,
Eduardo





En respuesta a Josefina Perez Curbelo

Re: Práctico 3 Ejercicio 10

de Eduardo Fernandez -

Hola Josefina, 

Complementando mi respuesta anterior y yendo al punto exacto de tu pregunta, si v contiene sólamente números negativos, la 

iteración va a continuar hasta que i>n, y va a intentar evaluar v(i)<0 y va a cancelar porque no existe v(i).

No cancela porque, como ya expliqué, Octave transforma el & en && y entonces se evita la evaluación de v(i)<0 con el i>n.

Espero que haya quedado más clara la pregunta concreta. 

Eduardo