Buenas, podrían ayudarme a entender bien que pide este ejercicio? No comprendo del todo leyendo la letra.
Por otra parte, no entiendo por que la función de factorial que vimos en el teórico no es recursión de cola si esta no presenta ninguna 'acción después' luego de usar recursivamente la función.
Gracias.
Hola Agustín,
Empiezo por el final.
La función que vimos en el teórico no es recursión de cola porque sí presenta una acción luego de usar la recursión.
La función factorial hace: "fact(n) = n*fact(n-1)".
Para esto, pimero hace la llamada recursiva, y cuando obtiene el resultado lo multiplica por n.
A modo de ejemplo, para n=3, fact(3) = 3*fact(2) = 3*2*fact(1) = 3*2*1 = 6
En el ejercicio 6 se pide que implementen la función factorial usando un acumulador (pasado por parámetro), justamente para implementar una recursión de cola.
A modo de ejemplo, para n=3, y sin dar la implementación, las invocaciones se harían de la siguiente manera: fact(3,1) -> fact(2,3) -> fact(1,6).
Saludos
Empiezo por el final.
La función que vimos en el teórico no es recursión de cola porque sí presenta una acción luego de usar la recursión.
La función factorial hace: "fact(n) = n*fact(n-1)".
Para esto, pimero hace la llamada recursiva, y cuando obtiene el resultado lo multiplica por n.
A modo de ejemplo, para n=3, fact(3) = 3*fact(2) = 3*2*fact(1) = 3*2*1 = 6
En el ejercicio 6 se pide que implementen la función factorial usando un acumulador (pasado por parámetro), justamente para implementar una recursión de cola.
A modo de ejemplo, para n=3, y sin dar la implementación, las invocaciones se harían de la siguiente manera: fact(3,1) -> fact(2,3) -> fact(1,6).
Saludos
/* Devuelve el producto de factorial (n) por 'acum '. */
//precondición : acum es 1 la primera vez que se invoca.
uint factAcum (uint n , int acum){
uint res;
if (n==0){
res=acum;
}else{
acum=n*acum;
res=factAcum(n-1,acum);
}
return res;
}
//precondición : acum es 1 la primera vez que se invoca.
uint factAcum (uint n , int acum){
uint res;
if (n==0){
res=acum;
}else{
acum=n*acum;
res=factAcum(n-1,acum);
}
return res;
}
buenas, armé este código. Cumpliría con ser recursión de cola? yo entiendo que si.
Me genera dudas que tengo que poner como precondición que acum = 1 la primera vez...
Es raro que acum entre como parámetro...
O sea: qué sentido tiene ponerle un valor distinto de 1 a acum en la primera invocación?'
Bueno,
Gracias
Mauricio
Hola Mauricio,
Tu solución es correcta y cumple con ser recursión de cola.
Naturalmente, para obtener el factorial de n, esa función debe ser invocada con valor 1 en acum, de lo contrario no tiene sentido. Invocarla con cualquier otro valor el resultado es incorrecto (multiplicaría el resultado de fact(n) por el acum que le pongas).
No es raro que acum entre como parámetro. En este caso puedes apreciar como el uso de dicho parámetro te brinda la posibilidad de resolver un ejercicio usando recursión de cola.
Saludos
Tu solución es correcta y cumple con ser recursión de cola.
Naturalmente, para obtener el factorial de n, esa función debe ser invocada con valor 1 en acum, de lo contrario no tiene sentido. Invocarla con cualquier otro valor el resultado es incorrecto (multiplicaría el resultado de fact(n) por el acum que le pongas).
No es raro que acum entre como parámetro. En este caso puedes apreciar como el uso de dicho parámetro te brinda la posibilidad de resolver un ejercicio usando recursión de cola.
Saludos