Entiendo que hay muchas preguntas incluso sobre la recursividad aquí, pero no sé en C si es mi lógica o mi sintaxis la que está mal (o presumiblemente ambas) porque, por lo que sé, es posible que necesite punteros. Especialmente cuando estoy usando la función en C, por lo que difícilmente puedo encontrar alguna pregunta que pueda entender como estudiante de primer año en la licenciatura de cs.
Entonces, mi tarea fue simplemente crear una matriz con números pares en el rango determinado en la entrada, si la entrada n = 10 , entonces la matriz debe contener [0, 2, 4, 6, 8, 10] , si n = 9 entonces el matriz sería simplemente [0, 2, 4, 6, 8] . Pero tengo que hacerlo con recursividad y no sé qué le pasa a mi código, ya que el resultado es algo extraño.
#include <stdio.h> int even(int x, int arrEven[]) { if (x == 0) { arrEven[0] = 0; return 0; } else if (x > 0) { arrEven[x - 1] = even(x - 2, arrEven) + 1; return arrEven[x - 1]; } } int main(void) { printf("n = "); int n; scanf("%d", &n); n = (n / 2) + 1; int arrEven[n]; even(n, arrEven); for (int i = 0; i < (n - 1); i++) { printf("%d, ", arrEven[i]); } printf("%d", arrEven[n - 1]); } Cuando ingresé 10 , la salida fue
0, 1, -731908444, 2, 781232032, 3en vez de
0, 2, 4, 6, 8, 10Mezclas el uso de una variable para dos propósitos. En su código, n se usa como índice en la matriz y como valor para colocar en la matriz al mismo tiempo.
Hay toneladas de opciones para hacer esto. Uno podría verse así:
#include <stdio.h> void even(int *arrEven, int value, int limit) { *arrEven = value; if (value < limit) { even(arrEven+1, value+2, limit); } } int main (void) { int limit; int count; printf("n = "); scanf("%d", &limit); // TODO: Check return value. if (limit < 0) { fprintf(stderr, "Only non-negative limits are allowed.\n"); exit(-1); } count = (limit / 2) + 1; int arrEven[count]; even(arrEven, 0, limit); for (int i = 0; i < count-1; i++){ printf("%d, ", arrEven[i]); } printf("%d\n", arrEven[count-1]); }Su función recursiva solo inicializa la mitad de la matriz de destino porque en arrEven[x - 1] = even(x - 2, arrEven) + 1; disminuye x en 2 en lugar de incrementar el valor en 2 . Puedes arreglar tu código de esta manera:
int even(int x, int arrEven[]) { if (x == 0) { arrEven[0] = 0; return 0; } else if (x > 0) { arrEven[x - 1] = even(x - 1, arrEven) + 2; return arrEven[x - 1]; } } Tenga en cuenta, sin embargo, que el código anterior no usa recursión de cola y requerirá una profundidad de pila proporcional a x . Aquí hay una alternativa donde la recursividad solo ocurre justo antes de regresar de la función:
void even(int n, int arrEven[]) { if (n > 0) { errEven[n - 1] = 2 * (n - 1); even(n - 1, arrEven); } }La función anterior debe compilarse en un código ejecutable similar a la versión iterativa equivalente:
void even(int n, int arrEven[]) { while (n > 0) { n = n - 1; errEven[n] = 2 * n; } }Creo que lo que quieres es algo como esto:
int even(int x, int arrEven[]) { if (x == 0) return 0; arrEven[x - 1] = even(x - 1, arrEven); return arrEven[x - 1] + 2; } Aquí x es puramente el índice de la matriz, y el hecho de que solo los valores pares entren en la matriz se maneja por el hecho de que 2 se agrega al valor devuelto por even junto con la condición terminal que devuelve 0 .