| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
tesssa
Registrado: 12 Ene 2007 Mensajes: 19
| Publicado: 29/08/2007 2:24 am | | | Título: funcion recursiva |
| Hola!! Estoy realizando un programa en lenguaje C en el que debo escribir una funcion recursiva que calcule el producto de dos enteros positivos utilizando unicamente sumas. Se que el producto de dos enteros utilizando sumas es, por ejemplo, 2*3=2+2+2=3+3, es decir m=2 sumado n=3 veces, o viceversa. Mi problema es que al realizar la funcion recursiva:
| Código: | int multiplica(int m, int n) {
...
} |
No se como realizar la llamada recursiva.
Elprograma que he realizado es el siguiente:
| Código: | #include <stdio.h> #include <stdlib.h>
int multiplica(int m, int n){ if (m==0 || n==0) return(0); if (m!=0 && n!=0) return(m+multiplica(m,n),n);
}
int main(int argc, char *argv[]) { int m,n,sol; printf("Introduce m: \n"); scanf("%d",&m); printf("Introduce n: \n"); scanf("%d",&n); sol=multiplica(m,n); printf("%d*%d=%d\n",m,n,sol); system("PAUSE"); return 0; } |
|
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 3657 Ubicación: Mexico
| Publicado: 29/08/2007 5:43 am | | | Título: |
| La base de la funcion recursiva es utilizar uno de los argumentos como contador, este indicaria cuantas veces se debe sumar el otro argumento.
La funcion recursiva debe realizar la operacion:
Si el contador es cero --- retornar cero. Caso contrario --- retornar el valor mas funcion(valor, contador menos uno)
Esto implementado como C estandar:
| Código: | #include <stdio.h> #include <stdlib.h>
int fn_multi(int a, int b);
int main(void) { int a; int b; puts("Primer numero:"); scanf("%d", &a); puts("Segundo numero:"); scanf("%d", &b); printf("%d * %d == %d\n", a, b, fn_multi(a, b)); return EXIT_SUCCESS; }
int fn_multi(int a, int b) { if (b == 0) return 0; else return a + fn_multi(a, b - 1); }
|
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | tesssa
Registrado: 12 Ene 2007 Mensajes: 19
| Publicado: 29/08/2007 9:26 am | | | Título: |
| Y si yo quiero hacer una funcion recursiva con vectores, por ejemplo calcular que elemento del vector es el mayor, como seria?? No deberia poner un for verdad?? deberia crear una cte que fuera mayor y comparar como de forma iterativa??
| Código: | #include <stdio.h> #include <stdlib.h> #define N 5
int maximo(int v[]){ if(v[N-1]>=v[0]) return (v[N-1]); else return(maximo (v[N-1])); }
int main(int argc, char *argv[]) { int v[N]={1,4,12,6,8}; int sol; sol=maximo(v[N]); printf("El valor maximo es %d\n",sol); system("PAUSE"); return 0; } |
|
| | Volver arriba | |  | | rir3760

Registrado: 01 Oct 2004 Mensajes: 3657 Ubicación: Mexico
| Publicado: 30/08/2007 10:07 pm | | | Título: |
| Espero que no me tomes por un pesado. ¿Intentaste siquiera compilar ese programa?
Con los tres compiladores que tengo instalados todos se quejan de la forma en que se llama a la funcion maximo, a esta solo le debes pasar el nombre del array sin utilizar el operador "[]", hacerlo asi es un error por varias razones.
El algoritmo de la funcion recursiva debe ser:
Si la lista solo contiene un elemento: --- retornar el valor de ese elemento Caso contrario: --- retornar el valor maximo ya sea el elemento --- siendo procesado o el valor maximo de los --- elementos restantes.
Te pongo un ejemplo con la lista de tu programa (esta es {1, 4, 12, 6, 8}):
1) Se retorna el maximo de 1 y {4, 12, 6, 8} 2) Se retorna el maximo de 4 y {12, 6, 8} 3) Se retorna el maximo de 12 y {6, 8} 4) Se retorna el maximo de 6 y {8} 5) Se retorna el valor 8
En este momento se terminan las llamadas en forma recursiva y se inicia el retorno de valores "hacia arriba", a partir del paso 4:
4) Se retorna el maximo de 6 y 8, este es 8. 3) Se retorna el maximo de 12 y 8, este es 12. 2) Se retorna el maximo de 4 y 12, este es 12. 1) Se retorna el maximo de 1 y 12, este es 12.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | tesssa
Registrado: 12 Ene 2007 Mensajes: 19
| Publicado: 31/08/2007 3:41 am | | | Título: |
| Si q lo he compilado y no solo ese, si no que he hecho muchas compilaciones antes. Pero el tema de la recursividad no lo entiendo muy bien, por eso he preguntado si estaba correcto asi, xq el valor de retorno no lo tenia claro. Gracias por la ayuda. |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 3657 Ubicación: Mexico
| Publicado: 31/08/2007 7:06 am | | | Título: |
| Es extraño, no deberia compilar ya que la la funcion la defines de esta forma:
| Código: | int maximo(int v[]) /* ... */ |
Con el detalle de que la funcion en realidad se procesa como si fuera declarada de esta forma:
| Código: | int maximo(int *v) /* ... */ |
Esto le indica al compilador que la funcion recibe la direccion en memoria donde se almacena un valor de tipo int.
El problema son las dos llamadas a funcion "maximo (v[N-1])" y "maximo(v[N])", en estas no pasas a la funcion las direcciones en memoria de esos elementos sino los valores almacenados en esos elementos. Tambien hay que agregar que en C y C++ los indices de los arrays inician en cero, esto lleva a que el elemento "v[N]" no existe: el indice del ultimo elemento del array es "N - 1".
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |