Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DickGumshoe en 7 Junio 2012, 15:29 pm



Título: Duda con función recursiva
Publicado por: DickGumshoe en 7 Junio 2012, 15:29 pm
Hola.

Tengo un ejercicio que dice:

Implemente una función recursiva (y todo lo necesario para que el programa funcione) que calcule, dado un vector de enteros y un umbral, la suma de todos los elementos del vector que son mayores que el umbral. La cabecera de la función recursiva debe ser la siguiente:

void SumaUmbral(int *v, int tam, int umbral, int *suma);

El vector debe ser creado con memoria dinámica y pedido al usuario por la consola. La variable suma se pasa por referencia. La variable tam contiene el tamaño del vector.


El problema que tengo es que yo siempre he pensado que las funciones recursivas deben devolver algo... ¿Cómo va a ser void?

Saludos, y muchas gracias.


Título: Re: Duda con función recursiva
Publicado por: kingdarnakes en 7 Junio 2012, 15:42 pm
Te has respondido tu mismo:
Citar
El vector debe ser creado con memoria dinámica y pedido al usuario por la consola. La variable suma se pasa por referencia. La variable tam contiene el tamaño del vector.


Título: Re: Duda con función recursiva
Publicado por: DickGumshoe en 7 Junio 2012, 15:48 pm
Me refiero a que yo las funciones recursivas las he hecho siempre así:


if(CASO BASE) return ALGO; (matriz, vector, una variable...)

else
{
...
...
return NombreFunciónRecursiva (parámetros);
}

Gracias.


Título: Re: Duda con función recursiva
Publicado por: Saberuneko en 7 Junio 2012, 16:03 pm
Por definición, las funciones siempre deberían devolver algo, si.

Es raro.

No sabría decirte cómo va eso exactamente...

¿Estás seguro de que copiaste bien el enunciado del ejercicio?


Título: Re: Duda con función recursiva
Publicado por: DickGumshoe en 7 Junio 2012, 16:08 pm
Pues le ha caído el ejercicio a mi hermana en un examen que ha hecho hoy, y el prototipo era ese (lo ha comprobado muchas veces, y por eso lo he preguntado).

Muchas gracias por aclararme la duda.

Saludos.


Título: Re: Duda con función recursiva
Publicado por: kingdarnakes en 7 Junio 2012, 16:28 pm
Por definición, las funciones siempre deberían devolver algo, si.

Es raro.

No sabría decirte cómo va eso exactamente...

¿Estás seguro de que copiaste bien el enunciado del ejercicio?

Amigo, estas equivocado que devuelve una función void?, en otros lenguajes se llaman procedimientos.

No te voy hacer la función para demostrártelo, pero creo que no tienes claro que significa que una variable se pase por referencia. Revisa ese concepto. El resto sería todo igual, buscas el caso base o los casos bases y ya esta.


Título: Re: Duda con función recursiva
Publicado por: DickGumshoe en 7 Junio 2012, 16:34 pm
Pasar una variable por referencia es pasar una copia del contenido de dicha variable, ¿no?

De ser así, además de que siempre he pensado que las funciones recursivas no podían ser void, aunque lo pudiera ser, no modificaría el contenido de *suma en main()...


Título: Re: Duda con función recursiva
Publicado por: Saberuneko en 7 Junio 2012, 16:39 pm
Pasar una variable por referencia es pasar una copia del contenido de dicha variable, ¿no?

No, lo que pasas es una dirección de puntero a la variable original.
En resumen, estás modificando sobre la variable original, no sobre una copia.

Citar
Amigo, estas equivocado que devuelve una función void?, en otros lenguajes se llaman procedimientos.

Cuando se me enseñó, en los enunciados se las llamaba procedimientos directamente, no "funciones que devuelven void".


Título: Re: Duda con función recursiva
Publicado por: 0xDani en 7 Junio 2012, 16:41 pm
Al contrario, pasas una copia de una variable cuando la pasas por valor, si la pasas por referencia el valor de la variable va a permanecer alterado cuando se vaya la funcion, y aunque la funcion en si no retorne nada, si va a modificar el contenido de la variable.

Saludos ;D


Título: Re: Duda con función recursiva
Publicado por: DickGumshoe en 7 Junio 2012, 16:44 pm
Ah, sí, me he confundido y he puesto la definición del paso por valor...

Entonces, ¿se puede hacer la función recursiva que he mencionado usando void?

Muchas gracias.


Título: Re: Duda con función recursiva
Publicado por: Saberuneko en 7 Junio 2012, 16:46 pm
Si, haciendo la llamada al procedimiento tal como la harías con la función.
En vez de ponerla en el return, colocas la llamada (con los parámetros necesarios) dentro de una condición "if" a cumplir, sin más complicaciones.


Título: Re: Duda con función recursiva
Publicado por: DickGumshoe en 7 Junio 2012, 16:49 pm
Ah, vale, muchas gracias.

Pensaba que era así como lo has dicho, pero como la profesora de mi hermana siempre ha dicho y ha puesto en los apuntes y ejercicios funciones recursivas que devuelven, pues no estaba seguro de si se podía.

Saludos.


Título: Re: Duda con función recursiva
Publicado por: Saberuneko en 7 Junio 2012, 16:52 pm
Ahora que lo recuerdo, acuérdate también que en ANSI C, las funciones nunca devuelven void ni se les pasa valores por referencia.

Si devuelve void o se les pasa un valor por referencia, cae de cajón que es procedimiento. Mi error fue leer "función", y no mirar la cabecera que pusiste.

Un Saludo.


Título: Re: Duda con función recursiva
Publicado por: DickGumshoe en 7 Junio 2012, 16:57 pm
Gracias por la aclaración.


Título: Re: Duda con función recursiva
Publicado por: kingdarnakes en 7 Junio 2012, 22:14 pm
En C los procedimientos no existen, lo dije en mi primer mensaje en otros lenguajes.

Porque se le pase un valor "por referencia" ya es un procedimiento? Suponiendo que llamar un procedimiento a una función del tipo void.

int tarar(int * v);

Devuelve un valor luego ya no es void, y se le pasa un valor por "referencia".


Título: Re: Duda con función recursiva
Publicado por: Saberuneko en 8 Junio 2012, 01:44 am
Si no me equivoco, según ANSI C. Es un procedimiento, si.
Tal vez esto es una colisión entre métodos de aprendizaje.

Yo solo cito lo que recuerdo haber aprendido.

¿Estás seguro de que estás hablando de ANSI C, conceptualmente?
(Sé que se llama function, de una forma u otra, pero conceptualmente, es o función, o procedimiento).


Título: Re: Duda con función recursiva
Publicado por: Ferno en 8 Junio 2012, 05:02 am
Procedimiento no devuelve nada y se lo simula devolviendo void en el lenguaje C, más allá del pasaje por referencia o no. Sigue siendo una función pero "simula" un procedimiento propiamente dicho.
Por ejemplo, en lenguajes que si diferencian una función de un procedimiento (como Pascal) tanto a un procedimiento como a una función se le podía pasar un valor por referencia.