La clave es escribir primero la recurrencia correcta. Una forma es proceder de la siguiente manera:
Si hay cero pasos, entonces hay una manera para que el niño suba los escalones (es decir, no hacer nada).
Si hay menos de cero pasos, por convención la respuesta es cero (es decir, la situación es imposible).
- ¿Cómo publicaría una observación matemática que he probado en una computadora?
- ¿Qué criterios utiliza para determinar si un artículo / publicación es útil para usted?
- Teoría de los tipos: ¿la comprensión de la correspondencia de Curry-Howard lo convierte en un mejor programador?
- ¿Cuál es una mejor especialización, CS o matemáticas?
- ¿Por qué necesitamos saber cálculo en informática?
De lo contrario, el niño puede subir uno, dos o tres escalones. El número de formas de proceder desde el paso actual es la suma de esas posibilidades. Es decir, podemos definir nuestra recurrencia como:
[matemáticas] s (0) = 1 [/ matemáticas]
[matemáticas] s (n) = s (n-1) + s (n-2) + s (n-3) [/ matemáticas]
Por lo tanto, puede calcular esto de forma recursiva (lo que sería muy lento) o, en su lugar, usar programación dinámica o memorización como sugieren las otras respuestas. Simplemente comience en 1 y aplique la fórmula anterior, luego pase a 2, etc., y en cada etapa ya hemos calculado los requisitos previos necesarios.
Sin embargo, hay otra forma de resolver la recurrencia (que desafortunadamente se aleja de las matemáticas simples). La función [matemáticas] s (n) [/ matemáticas] tiene una secuencia generadora correspondiente, de la forma:
[matemáticas] G (z) = s (0) z ^ 0 + s (1) z ^ 1 + s (2) z ^ 2 +… [/ matemáticas]
La secuencia generadora contiene todas las respuestas posibles en una sola expresión. ¿Cómo nos ayuda esto? Bueno, podemos reescribir la recurrencia anterior como una recurrencia en la función generadora:
[matemática] G (z) = zG (z) + z ^ 2G (z) + z ^ 3G (z) + 1 [/ matemática]
resolviendo eso nos da
[matemáticas] G (z) = \ frac {-1} {z ^ 3 + z ^ 2 + z – 1} [/ matemáticas]
Si podemos evaluar el coeficiente de G en una [matemática] z ^ n [/ matemática] arbitraria, entonces eso nos da los [matemáticos] s (n) [/ matemáticos] correspondientes. Algunos paquetes de software calcularán esto por usted. O puede calcular la derivada [math] n [/ math] th y evaluarla en 0.
Pero hay una manera de transformar esto en una forma cerrada. Involucra las raíces de [matemáticas] z ^ 3 + z ^ 2 + z – 1 [/ matemáticas], que desafortunadamente están en una forma muy difícil de trabajar. Pero el Teorema de la expansión racional (ver Graham, Knuth y Patashink sección 7.3) nos da la siguiente forma aproximada:
[matemáticas] s (n) = (0.618363) (1.8392) ^ n + [/ matemáticas]
[matemáticas] (0.029252 + 0.014515i) (- 0.41964 – 0.60629i) ^ n [/ matemáticas] [matemáticas] + [/ matemáticas]
[matemáticas] (0.029252 – 0.014515i) (- 0.41964 + 0.60629i) ^ n [/ matemáticas]
que, aunque no es exacto debido al redondeo, proporciona valores bastante cercanos. Si necesita calcular un valor aproximado para n muy grande, esto sería mejor que incluso la programación dinámica que es de orden O (n), mientras que los exponenciales se pueden calcular en tiempo logarítmico (o mejor, dependiendo del modelo aritmético que asuma). .)