La respuesta corta es no’.
Sin embargo, este es un punto demasiado simplificado, ya que los algoritmos en el mismo paradigma de programación están naturalmente estructurados de la misma manera. Por lo tanto, restringir el paradigma naturalmente restringe el lenguaje. El resto es a veces.
Antecedentes
- Cómo resolver http://www.spoj.com/problems/SAMER08A/ usando el algoritmo de Dijkstra
- ¿Cuál es el mejor algoritmo para un conjunto de datos con muchas características correlacionadas, débiles y ruidosas?
- ¿Por qué los conjuntos en Python tienen una complejidad algorítmica de O (1)?
- Cómo alterar el rango de un bucle for dentro del bucle en Python
- Necesito saber cómo describir el cálculo del PageRank de punto fijo. ¿Alguien sabe algo al respecto?
La computación es un ejercicio matemático. Esa es una meta-matemática invariante. Así que lo dejaré ahí 🙂
Todos los lenguajes de programación reducen el contenido legible por humanos hasta el código de máquina de alguna manera. La naturaleza de 3GL y superior es la regularidad sintáctica. No funciona muy bien traducir el lenguaje natural, inconsistente en su uso, directamente al código de máquina.
Un algoritmo expresado en forma matemática tendrá algún “equivalente” en un lenguaje de programación. Para llegar allí, intuitivamente restringimos el espacio “matemático” al del paradigma con un simbolismo apropiado y lo asignamos a las palabras clave del lenguaje.
Godel?
El primer teorema de incompletitud de Godel demuestra que las matemáticas no pueden ser tanto completas como consistentes exactamente al mismo tiempo. Con la mayoría de las reglas de coherencia de los lenguajes de programación. Para ganar coherencia (un concepto de bucle utilizado en una parte del editor es lo mismo que un bucle utilizado en otra) tenemos que renunciar a la integridad, lo cual está bien, ya que el lenguaje es una gramática regular de todos modos. No todas las combinaciones de caracteres terminales son válidas. Por lo tanto, es naturalmente incompleto. Hará 🙂
Mapeando diferentes paradigmas
La construcción de bucle predeterminada en, por ejemplo, la programación funcional es la recursividad. Esto se correlaciona muy de cerca con las estructuras matemáticamente naturales llamadas relaciones de recurrencia.
Por ejemplo:
[matemáticas] n_t! = n_t (n_t-1)! [/ matemáticas]
Se presenta en lenguajes funcionales como Haskell:
factorial 0 = 1
factorial t = t * factorial (t-1)
Por el contrario, si bien puede hacer algo como esto como un método C #:
// Cosas de arriba
public int factorial (int t) {
volver t == 0? 1: t * factorial (t – 1);
}
Muchas, si no la mayoría de las personas que he conocido en mis viajes proverbiales, en realidad escriben esta versión iterativa:
public int factorial (int t) {
int resultado = 1;
para (int i = t; i> 0; i–) {
resultado * = i;
}
resultado de retorno;
}
En este caso, ambos tienen la misma complejidad de tiempo combinatorio, pero la función recursiva ocupa un poco más de memoria (para almacenar el marco de la pila de funciones). En casos más avanzados (por ejemplo, árboles binarios, n-arios), la forma en que lo escribe cambia fundamentalmente la complejidad combinatoria del algoritmo.
Resumen
Este problema suele ser la forma en que se da entre paradigmas. De hecho, en lenguajes declarativos es aún peor, ya que generalmente no existe un concepto definido de un bucle, ni una asignación variable. Lenguajes como XSL, TSQL y PL / SQL e incluso lenguajes semifuncionales como SML se atornillan en operaciones no estándar para permitir la asignación. Como los cursores, ‘seleccionar’ en una variable, bucles, etc.
Editar: aquí hay un ejemplo del mundo real de la optimización de problemas de programación usando las matemáticas.
¡Explosión del pasado!