Este ejercicio
consiste en la suma de los elementos de un vector (ordenado o sin ordenar) de forma recursiva en
lenguaje C.
Recursin o recursividad es la forma en la cual se especifica un proceso basado en su propia definicin.
Siendo un poco ms precisos, y para evitar el aparente crculo sin fin en esta definicin:
Un problema que pueda ser definido en funcin de su tamao, sea este N, pueda ser dividido en
instancias ms pequeas (< N) del mismo problema y se conozca la solucin explcita a las instancias
ms simples, lo que se conoce como casos base, se puede aplicar induccin sobre las llamadas ms
pequeas y suponer que estas quedan resueltas. Para que se entienda mejor a continuacin se exponen
algunos ejemplos:
* Factorial(x: Entero): Sea N := x el tamao del problema, podemos definir el problema de forma
recurrente como x*Factorial(x 1); como el tamao de Factorial(x 1) es menor que N podemos aplicar
induccin por lo que disponemos del resultado. El caso base es el Factorial(0) que es 1.
* Ordenacin por fusin(v: vector): Sea N := tamao(v), podemos separar el vector en dos mitades. Estas
dos mitades tienen tamao N/2 por lo que por induccin podemos aplicar la ordenacin en estos dos
subproblemas. Una vez tenemos ambas mitades ordenadas simplemente debemos fusionarlas. El caso
base es ordenar un vector de 0 elementos, que est trivialmente ordenado y no hay que hacer nada.
En estos ejemplos podemos observar como un problema se divide en varias (>= 1) instancias del mismo
problema, pero de tamao menor gracias a lo cual se puede aplicar induccin, llegando a un punto donde
se conoce el resultado (el caso base)
Fuente: Wikipedia
Si alguien quiere saber ms sobre la recursividad, puede leer el artculo entero en la wikipedia.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include
#include
int main()
{
int n = 3;
int t[] = {1,2,3,4};
printf("Resultado de la suma recursiva: %d", sumaVector(t,n));
return 0;
}
int sumaVector(int t[], int n){
int r = 0;
if(n==0){
r += t[0];
}else{
r = t[n] + sumaVector(t,n-1);
}
return r;
Mientras no lleguemos al principio del vector, sumamos el elemento anterior al que estamos sumando
restando en uno la posicin (n-1) en la llamada recursiva.
No related posts.
Recursividad
Ejercicio
La famosa sucesin de Fibonacci puede definirse en trminos de recurrencia de la
siguiente manera:
Notar que la condicin de parada se cumple cuando se llega al final del array. Otra
alternativa es recorrer el array desde el final hasta el principio
(de derecha a izquierda):
int sumarray(int numeros[], int posicion)
{
if (posicion == 0) return numeros[posicion];
else return numeros[posicion] + sumarray(numeros, posicion-1);
}
...
int numeros[5] = {2,0,-1,1,3};
int N = 5;
printf("%d\n",sumarray(numeros, N-1));
Hay que tener cuidado con dos errores muy comunes: el primero es declarar la
variable para que se pase por valor y no por referencia, con lo cual no se obtiene
nada. El otro error consiste en llamar a la funcin pasando en lugar del parmetro
por referencia una constante, por ejemplo: mayor(numeros, 5-1, 0); en este caso
adems se producir un error de compilacin.
Ejercicios propuestos
Nota: para resolver los ejercicios basta con hacer un nico recorrido sobre el array.
Tampoco debe utilizarse ningn array auxiliar, pero si se podrn utilizar variables de
tipo entero o booleano.
- Dado un array constituido de nmeros enteros y que contiene N elementos
siendo N >= 1, escribir una funcin que devuelva la suma de todos los elementos
mayores que el ltimo elemento del array.
- Dado un array constituido de nmeros enteros y que contiene N elementos
siendo N >= 1, escribir una funcin que devuelva cierto si la suma de la primera
mitad de los enteros del array es igual a la suma de la segunda mitad de los
enteros del array.
- Dados dos arrays A y B de longitud n y m respectivamente, n >= m cuyos
elementos estn ordenados y no se repiten, determinar si todos los elementos de B
estn contenidos en A. Recordar que los elementos estn ordenados, de esta
manera basta con realizar un nico recorrido sobre cada array.
Conclusiones
En esta seccin se ha pretendido mostrar que la recursividad es una herramienta
potente para resolver mltiples problemas. Es ms, todo programa iterativo puede
realizarse empleando expresiones recursivas y viceversa.
return 0;
5. else
6.
7. }
return a[n-1]+suma(a,n-1);
return=A[0];
5. else
6.
7. }
1.
////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
2.
3.
4.
/* PROGRAMA PRINCIPAL
Author: JOSE PINO - SANTIAGO TORTORA
Dado un vector de N numeros reales y un numero entero k, determinar el
k-esimo mayo elemento.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17. */
18.
19. #include <stdio.h>
20. #include <stdlib.h>
21. #include <time.h>
22.
23. //////////////Prototipos////////////////////////////
24. void cargarArreglo (int *A, int tam);
25. void imprimirKesimos (int *A, int tam, int k);
26. int seleccion_mayor1 (int *A, int k, int n);
27. int seleccion_mayor2 (int *A, int k, int n);
28. ////////////////////////////////////////////////////
29.
30.
31.
32.
33.
34.
35. //////////////////////////////////////////FUNCION
PRINCIPAL////////////////////////////////////////////////////////////////
///////////
36. int main () {
37.
38.
system ("cls");
39.
int N;
40.
41.
int k;
int maxValorK = 10;
//Cantidad maxima de K para el ejemplo, muestra los
top 10 del mayor al menor
42.
43.
44.
for
//Imprime en
pantalla la cantidad N
46.
47.
printf("\n----------------------------------------------\n");
48.
int b[N];
//Dimensiona el arreglo para N valores
49.
50.
51.
52.
cargarArreglo(b,N);
//Funcion que carga el arreglo de tamao N con valores
random
53.
54.
55.
56.
printf("\n");
57.
58.
59.
printf("\n\n");
60.
61.
62.
system ("PAUSE");
63.
64.
return 0;
65.
66.
67. }
68. ////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
69.
70.
71.
72.
73.
74.
75.
76.
77.
78. ////////////////////////////////////////////////////////////////////////
////////////////////////////////
79. /*Funciona primero ordenando el arreglo por el metodo burbuja de mayor a
menor y luego con un puntero
80. se ubica en
la posicin k-esima */
81.
82. int seleccion_mayor1 (int *A, int k, int n) {
83.
84.
85.
86.
87.
int i;
88.
int j;
89.
int resultado;
90.
int aux;
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
aux = A[j+1];
104.
A[j+1]=A[j];
105.
A[j]=aux;
106.
107.
108.
109.
}
}
110.
111.
112. resultado = (A[k-1]);
134.
135.
136.
137.
138.
139.
140. ////////////////////////////////////////////////////////////////////////
////////////////////////////////
141. /*Funciona haciendo ejecutando k veces un bucle que ajusta el tope de
acuerdo al mayor
142. encontrado en el recorrido previo*/
143.
144. int seleccion_mayor2 (int *A, int k, int n) {
145.
146.
147.
148.
int tope;
149.
int mayor;
150.
int i;
151.
int j;
152.
int max;
153.
int valorkesimo;
154.
mayor = -999999999;
155.
tope = 99999999;
156.
157.
158.
159.
k-esimo termino
160.
for
(j = 0; j< n; j++) {
//Recorrido del vector
161.
&&
((A[j])<tope) ) {
valorkesimo = A[j];
164.
mayor = A[j];
165.
166.
167.
168.
tope = valorkesimo;
//Se ajusta el tope al mayor para que el tope
mayor = -9999;
171.
172.
173.
174.
175.
176. //printf ("\tPrueba respuesta A2: %d", valorkesimo);
177. return (valorkesimo);
178.
179. }
180. ////////////////////////////////////////////////////////////////////////
////////////////////////////////
181.
182.
183.
184.
185.
186.
187. ////////////////////////////////////////////////////////////////////////
////////////////////////////
188. /*Funcion que carga el arreglo con valores aleatorios*/
189. void cargarArreglo (int *A, int tam) {
190.
191.
int i;
192.
193.
194.
A[i] = rand()%11;
196.
197. }
198. ////////////////////////////////////////////////////////////////////////
////////////////////////////
199.
200.
201.
202.
203.
204.
205.
206.
207. ////////////////////////////////////////////////////////////////////////
////////////////////////////
208. /*Funcion que llama a cada funcion de resolucion, mide el tiempo e
imprime los valores medidos*/
209. void imprimirKesimos (int *A, int tam, int k) {
210.
211.
212.
213.
214.
215.
inicio1=clock();
216.
//Llamada a
la primera funcion
217.
final1=clock();
218.
total1=(final1-inicio1)/(double) CLOCKS_PER_SEC;
219.
220.
221.
222.
223.
printf ("
%f",(total1));
224.
225.
226.
227.
228.
229.
inicio2=clock();
230.
//Llamada a la
segunda funcion
231.
final2=clock();
232.
total2=(final2-inicio2)/(double) CLOCKS_PER_SEC;
233.
234.
235.
printf ("
236.
printf ("
%f", (total2));
");
237.
238.
239. }
240. ////////////////////////////////////////////////////////////////////////
////////////////////////////