PROBLEMA 1: La funcion A(N) crece bastante lento. De hecho, se puede demostrar por induccion que A(N) = N techo(log_2 N) - 2^techo(log_2 N) + 1. Tambien se habran dado cuenta que A(N) se puede calcular recursivamente sin gran perdida de velocidad. Sin embargo, la idea era practicar las tecnicas de recursion con memoria o las de calculo iterativo. Como la primera es una tecnica bastante mecanica, les muestro un fragmento que usa la segunda. Las respuestas a la pregunta son A(3) = 6, A(31) = 155, A(314) = 2629, A(3141) = 36738 y A(31415) = 469873. a[1] = 1; for (i = 2; i <= n; i++) a[i] = a[i/2] + a[(i+1)/2] + i - 1; PROBLEMA 2: La funcion B(N) tambien crece bastante lento. La pregunta es si pueden decir cuanto vale exactamente B(N) en terminos de N. Por supuesto que esta funcion tambien puede calcularse recursivamente, pero abajo les muestro un fragmento que lo hace de forma iterativa. Las respuestas a esta pregunta son B(2) = 1, B(27) = 4, B(271) = 1, B(2718) = 44 y B(27182) = 3. b[1] = 1; for (i = 2; i <= n; i++) { b[i] = 0; for (j = 1; j < i; j++) if (!(i % j)) b[i] += b[j]; } PROBLEMA 3: La funcion C(N) crece bastante rapido. De hecho, se puede demostrar que C(N) = comb(2N-2, N-1) / N, aunque es mas facil demostrar que C(N) es el numero de formas de escribir N parejas de parentesis balanceados. Las respuestas a esta pregunta (usando unsigned long long int) son C(4) = 5, C(16) = 9694845, C(64) = 7096100506878905693, C(256) = 5598810189732485341 y C(1024) = 3459560239708030685. Esta funcion ya no se puede calcular de forma recursiva eficientemente. Debieron haber usado al menos la tecnica de recursion con memoria o la de calculo iterativo como muestro abajo. c[1] = 1; for (i = 2; i <= n; i++) { c[i] = 0; for (j = 1; j < i; j++) c[i] += c[j]*c[i-j]; }