¿Cuál es la regla de trabajo de este progtwig, Explicación?

Estoy poco confundido en este progtwig. Si alguien me pudiera explicar la funcionalidad de este código y la salida, obtendré la salida de este progtwig como tal.

1 1 2 2 3 3 

Todo lo que quiero saber es la regla de trabajo de esas dos funciones, ¿cómo calculan los valores?

 #include  #include  #include  int M(const int n); int F(const int n) { return(n==0)?1:nM(F(n-1)); } int M(const int n) { return (n==0)?0:nF(M(n-1)); } int main() { int i; for(i=0;i<6;i++) { printf("%2d\n",F(i)); } printf("\n"); return 0; } 

Considerar for

 for(i=0;i<6;i++) { printf("%2d\n",F(i)); } 

Respuesta corta:

F(0) => 1;

F(1)=> 1 - M(F(0))

 when F(0):1 then F(1) = 1 - M(1) go to calculate M(1), but we start from 0, M(0)= 0; M(1) = 1- F(M(0)) = 1- F(0) = 1-1=0; last we have M(1) = 0; and as F(1) = 1-M(1) = 1-0=1 last we have: F(1)=1 

Más completo:

Veamos F() modo de trabajar. el último comando en F() , return(n==0)?1:nM(F(n-1));

expandido a

 if (n==0){ return 1; }else{ return nM(F(n-1)); } 

En primer lugar para la iteración i:0 , queremos F(0) ya que n es cero, ( n:0 ), if (n==0) es verdadero, return 1; se ejecuta y el valor de F(0) tiene que ser 1.

para la segunda iteración queremos F(1) , para eso if (n==0) es falso y de lo contrario se ejecuta el bloque.

como ahora el n:1 , F(1) = 1 - M (F(0)) .

En la iteración anterior tenemos F(0)=1 , OK, ahora podemos volver a cablear o la ecuación: F(1) = 1 - M(1) , es obvio que si tenemos el valor de M(1) simplemente, póngalo en La última fórmula, F(1) ha sido resuelta.

Para ello debemos ampliar la función M() .

Del mismo modo podemos escribir para M() .

 if (n==0){ return 0; }else{ return nF(M(n-1)); } 

M(0) = 0;

M(1)= 1- F(M(0))= 1- F(0) = 1 - 1=0;

ahora tenemos M(1) = 0; al ponerlo en F(1) = 1 - M(1) logramos que F(1) = 1 .

Ahora los primeros dos pares de 1 en la salida de su código se calculan a mano.

Para otros, haz esto una y otra vez.

Como se sugiere en los comentarios, intente rastrear el código manualmente, pasaré por las dos primeras iteraciones con usted para que tenga la idea

Cuando su progtwig se inicia, llama a su función main y comienza a ejecutar el bucle for de la siguiente manera:

 i=0 => calls F(n=0) => is n==0 true? Yes => return 1 => print 1 i=1 => calls F(n=1) => is n==0 true? No => then 1-M(F(0)) => F(0) calculated from the previous iteration to return a value of 1 => call M(n=1) => is n==0 true? No => then 1-F(M(0)) => M(0) returns 0 since n==0 is true => then 1-F(M(0)) is equal to 1-F(0) => we calculated F(0) to return 1 => so 1-F(0) return 0 from M => take the return back to 1-M(F(0)) => 1-0 = 1 => print 1 

No se sienta frustrado porque lo que está pidiendo sería en realidad mucho más fácil de entender con algún paciente. Le recomiendo que mantenga presionado un lápiz y papel y comience a rastrearse.

  1. Ir iteración por iteración como lo hice.
  2. Llame a cada función de acuerdo con el flujo correcto de las condiciones if.
  3. Cuando llama a una función, marque donde dejó en el código para saltar a dicha función, de modo que una vez que devuelva un valor, sepa exactamente dónde colocar el valor devuelto.

Paz de papel, paciencia, y traza.