[Resuelto] Ayuda, para un ejercicio de javascript para la facultad.

Iniciado por MaxiGanar, 23 Julio 2015, 19:21 PM

0 Miembros y 3 Visitantes están viendo este tema.

MaxiGanar

Hola gente del elhacker.net, mi nombre es Maxi y soy estudiante de ingenieria en sistemas, necesito su ayuda en un ejercicio de javascript.

El ejercicio consiste, en que me dan un codigo, y yo tengo que decir, que numero/s va a aprecer por pantalla.

el codigo es el siguiente.

Código (javascript) [Seleccionar]
<html>
     <head>
          <title>hola mundo</title>
          <script language="javascript">
         
       {
          M1(3);        
          var x = 1;
          alert(x);
          }
          function M1(t,r){
                  if (1<t){
                   var x = 1;
                   M1 (t-1 , M2);        
                   }
                   else {
                        r(t+1);
                        }
                   
          function M2(y){
                   x= t + y;
                   }
                   alert (x);
                   }
         
          </script>
     </head>
     
     <body>
     
     </body>
</html>

     

Necesito que me ayuden, como PASO A PASO, se van creando las variables y como van teniendo dicho valor, por que me pierdo mucho en el momento que se llaman las subrutinas. (por cierto me olvide mencionar, que pueden usar compilador para saber sus valores, pero la idea es que me expliquen como se va llegando a esos valores).

Gracias por su ayuda.

Mod: Los códigos deben ir en etiquetas GeSHi, tema movido, el título debe ser descriptivo al problema, modifícalo

engel lex

#1
el código está malo... en M1, en la linea 14, se pasa M2 como una variable, pero M2 es una función, en la linea 17 es lo contrario, se para 8 como función pero r es variable, a demás M2, está incluido dentro de M1, y queda de más decir que es mala practica anidar funciones


por otro lado si usas google chrome, el te puede ayudar con eso... tiene un debugger de jscript integrado

aquí todo lo que necesitas saber sobre el
https://developer.chrome.com/devtools/docs/javascript-debugging
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

MaxiGanar

Gracias por tu respuesta, pero aun que no lo creas, no hay errores. Te explico mas o menos el por que, en la linea 14, se pasa como argumento M2 como argumento ya que, se utiliza la tecnica "Subrutinas como parametros". Y este se pone en juego los 2 terminos de Vinculacion Profunda y Vinculacion Superficial. Para explicarlo mas o menos cada uno se definen asi,

Vinculacion Profunda: Vincula al ambiente de referencia, en el momento que el procedimiento se pasa como argumento.

Vinculacion Superficial: Vincula al ambiente de referencia, en el momento que el procedimiento, REALMENTE se llama.

engel lex

ya! pasas M2 como referencia para que r se pueda ejecutar como función, se me había pasado eso, igual con el debugger de chrome podrías ver eso claramente
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

MaxiGanar

Muchisimas gracias por la ayuda, ya entendi el ejercicio!! y lo pude resolver! =D. Saludos!.

MinusFour

Por partes:

Código (javascript) [Seleccionar]

M1(3);       
var x = 1;
alert(x);


Tu programa básicamente empieza por llamar M1 con el valor de 3

Código (javascript) [Seleccionar]

function M1(t, r) {
    if (1 < t) {
        var x = 1;
        M1(t - 1, M2);
    } else {
        r(t + 1);
    }

    function M2(y) {
        x = t + y;
    }
    alert(x);
}


Al llamar M1(3), caemos en el if del condicional.
Código (javascript) [Seleccionar]

    if (1 < t) {
        var x = 1;
        M1(t - 1, M2);
    }


Declaras X con el valor de 1 (en el contexto de la llamada M1(3))
Se vuelve a llamar M1 con (3-1, M2) (x y t en el contexto de M2 es x, t en el contexto de M1(3), 3, 1).
Caes de nuevo en el if del condicional.
Declaras X con el valor de 1. (en el contexto de la llamada M1(2))
Se vuelve a llamar M1 con (2-1, M2) (x, t en el contexto de M2 es x, t en el contexto de M1(2), 2, 1).
Ya no caes en el if del condiciona.
Llamas a r (M2) con 2.
Código (javascript) [Seleccionar]

    function M2(y) {
        x = t + y;
    }

x (de M1(2)) es 4.
Imprimes x (no esta definida en el contexto de M1(1) ni en el contexto global).
Regresas a la llamada M1(2).
Imprimes x (4).
Regresas a la llamada M1(1).
Imprimes x (1).
Regresas a tu programa.
Defines x como 1.
Imprimes x (1).