¿Cómo funciona esta recursión?

Bueno, en este momento no funciona, cometiste un error en tu código. Aquí está la versión corregida:

0 1 2 3 N
elemento A B C D E
tamaño 3 4 7 8 9
val 4 5 10 11 13

typedef struct {int size; int val; } articulo;

int knap (int cap)
{
int i, espacio, max, t;
para (i = 0, max = 0; i <n; i ++)
{
if ((espacio = cap – elemento [i] .size)> = 0)
if ((t = knap (espacio) + elemento [i] .val)> max)
max = t;
}
retorno max;
}

Entonces, lo que hace este código es implementar el algoritmo de mochila de programación dinámica (problema de mochila). Cuando llama a la función knap (cap), calcula el valor máximo que puede tener una mochila de tamaño = cap. Para hacer esto, intenta colocar cada elemento por sí mismo y verifica el valor máximo posible de una mochila con el espacio restante, knap (cap-item [i] .size). Luego devuelve la combinación con el valor máximo.

También es bastante lento, debe introducir la memorización , que conduce a:

int memoize [MAXCAP];
// establece todo en -1

typedef struct {int size; int val; } articulo;

int knap (int cap)
{
if (memorizar [cap]! = – 1)
volver memorizar [cap];
int i, espacio, max, t;
para (i = 0, max = 0; i <n; i ++)
{
if ((espacio = cap – elemento [i] .size)> = 0)
if ((t = knap (espacio) + elemento [i] .val)> max)
max = t;
}
memorizar [cap] = max;
volver memorizar [cap];
}

Con la memorización, evita calcular cada llamada de función desde cero. La primera vez que llama a knap (cap) almacena el resultado en una tabla, por lo que simplemente lo devuelve cada vez que lo llama en el futuro en lugar de volver a calcularlo.

¿Qué tal desperdiciar algunas páginas?
Tome un cuaderno y vea por usted mismo cómo funciona. Para cada llamada de la función Knap, vaya a una nueva página y haga el cálculo y cuando la función finalice regrese a la página anterior donde se llamó a la función con el resultado calculado y vea cómo obtiene la respuesta correcta al final.

Para ser honesto, no es realmente importante entender cómo funciona una recursión. Lo más importante es la comprensión de la lógica de inducción detrás de la recursividad.