¿Cuál es la ecuación matemática correcta para el siguiente problema informático?

Debería usar la recursividad, pero tal vez no en la forma en que la implementó, que dijo que tomó demasiado tiempo.

Lo importante para aprender a través de estos problemas es qué variables usar para describir el problema: no muy pocas ni demasiadas. Visto de manera más abstracta, está eligiendo una estructura de datos, solo que aquí la estructura de datos es realmente muy simple: un conjunto de variables, o matrices, para contener los recuentos del número de secuencias apropiadas.

Podría comenzar con un modelo ingenuo que simplemente tiene [math] w_n [/ math] como el número de palabras legales de longitud [math] n [/ math]. Esto es directamente lo que se le pide que calcule, por lo que es una idea atractiva. El problema es que no hay una forma aparente de determinar [matemáticas] w_ {n + 1} [/ matemáticas] a partir de [matemáticas] w_n [/ matemáticas] o incluso todas las [matemáticas] w_i [/ ​​matemáticas] anteriores.

La razón es esta: si simplemente le dijera que hay [matemáticas] 23,734 [/ matemáticas] palabras legales de longitud [matemáticas] 10 [/ matemáticas], y luego le pregunto cuántas palabras legales hay de longitud [matemáticas] 11 [/ math], naturalmente trataría de ver qué letras se pueden agregar al final de cada palabra de [10] [- math] para formar una palabra de letra [math] 11 [/ math]. Pero no lo sabes, ¿verdad? Algunas de esas palabras de letras [matemáticas] 10 [/ matemáticas] terminan en A, por lo que no puede poner una A o una E al final. Otras palabras terminan en C, por lo que puede poner cualquier cosa excepto una C. Pero el simple conteo total de palabras legales de longitud [matemáticas] 10 [/ matemáticas] no le dice cuántas de esas palabras terminan con una A o una B o lo que sea

Entonces necesita refinar su modelo. Un enfoque razonable es introducir cinco variables: el número de palabras legales que terminan en A, el número de aquellas que terminan en B, y así sucesivamente.

Esto realmente funcionará bien, pero es demasiado engorroso. Todo lo que realmente necesita son solo dos variables: Sea [math] c_n [/ math] sea el número de palabras legales de longitud [math] n [/ math] que terminan en una consonante, y sea [math] v_n [/ math] ser el número de tales palabras que terminan en vocal.

Ahora, prueba:

[matemáticas] v_ {n + 1} = 2c_n [/ matemáticas]

[matemáticas] c_ {n + 1} = 3v_n + 2c_n [/ matemáticas]

[matemáticas] v_1 = 2 [/ matemáticas]

[matemáticas] c_1 = 3 [/ matemáticas]

[matemáticas] w_n = v_n + c_n [/ matemáticas]

Desde aquí puede proceder de varias maneras, todas útiles para saber. Una es simplemente implementar una función que calcule [math] c_n [/ math] y [math] v_n [/ math] de forma recursiva. Otra es apegarse al lado matemático de las cosas y encontrar una fórmula más explícita, utilizando la diagonalización matricial o las funciones generadoras. Todos estos métodos funcionarían aquí.

EDITAR: el OP solicitó una fórmula explícita. Usando los métodos que sugerí, la fórmula se puede escribir de la siguiente manera:

[matemáticas] \ lambda_1 = 1 + \ sqrt {7} [/ matemáticas]

[matemáticas] \ lambda_2 = 1- \ sqrt {7} [/ matemáticas]

[matemáticas] a = \ frac {5} {2} + \ frac {13} {2 \ sqrt {7}} [/ matemáticas]

[matemáticas] b = \ frac {5} {2} – \ frac {13} {2 \ sqrt {7}} [/ matemáticas]

[matemáticas] w_n = a \ lambda_1 ^ n + b \ lambda_2 ^ n [/ matemáticas].

Bueno, mi idea para esto sería tratar de calcular el número de palabras de mono inválidas, y restar eso de todas las posibles secuencias de letras de mono.

En primer lugar, hay 5 ^ n secuencias posibles. Quita eso del camino primero.

Una secuencia no es válida si contiene la misma letra dos veces seguidas.

Hay (n-1) posiciones para una secuencia de dos letras. Hay 5 posibles secuencias de 2 letras.

La palabra comenzará con una letra (bueno, no lo dices). Diremos que es una A, y luego multiplicaremos todo por 5 para obtener el número real de palabras inválidas.

La siguiente letra puede ser la misma. En este caso, hay 5 ^ (n-2) tales casos debido a las letras restantes (n-2), que pueden ser cualquier cosa.

Si no, la tercera letra puede ser la misma que la segunda. En este caso, hay 4 * 5 ^ (n-3) tales casos debido a las letras restantes (n-2) y la segunda letra (teniendo en cuenta que no puede ser el primer carácter).

Si no, la cuarta letra puede ser la misma que la tercera. En este caso, hay 4 ^ 2 * 5 ^ (n-4) tales casos.

Si no … Y continúa el proceso.

Obtenemos 5 ^ (n-2) + 4 * 5 ^ (n-3) +… + 4 ^ (n-2).

Ahora, multiplicamos todo por 5 y obtenemos 5 ^ (n-1) + 4 * 5 ^ (n-2) +… + 4 ^ (n-2) * 5.

También podría haber una secuencia AE o EA. Hay 2 * 5 ^ (n-2) * (n-1) posibilidades para esto; sin embargo, suponiendo que todos los pares de letras adyacentes sean distintos, solo hay 2 * 4 ^ (n-2) * (n-1) posibilidades para esto.

Por lo tanto, hay 5 ^ n – [5 ^ (n-1) + 4 * 5 ^ (n-2) +… + 4 ^ (n-2) * 5] – 2 * 4 ^ (n-2) * (n-1) tales palabras de mono.

No he comprobado esto, pero para mayores n, creo que funciona.

En lugar de recurrencia, puede usar programación dinámica. La programación dinámica equivale esencialmente a la recursión calculada de forma ascendente mientras se almacenan resultados intermedios en una tabla. Use dos matrices 1-D. v [i] almacenará el número de palabras de mono que terminan en una vocal y c [i] almacenará el número de palabras de mono que terminan en una consonante. En pseudocódigo, tenemos lo siguiente.

v [1] = 2; // 2 palabras de mono de longitud 1 terminan en vocal
c [1] = 3; // 3 palabras de mono de longitud 1 terminan en una consonante
para i = 2 a N
Calcule v [i] y c [i] a partir de v [i-1] y c [i-1] utilizando su regla recursiva
print “El número de palabras de mono es”, v [N] + C [N}