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
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
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