¿Son los algoritmos iguales para todos los lenguajes de programación?

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

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!

Pueden ser, pero no siempre tiene sentido. Toby Thain y Ethar Alali dieron la respuesta en la que inicialmente pensé.

Sin embargo, al pensar más, me di cuenta de que es NORMALMENTE POSIBLE (pero no necesariamente PRÁCTICO) implementar el mismo algoritmo en cada lenguaje “popular” o “práctico”, independientemente del paradigma.

Digo normalmente, porque estoy seguro de que hay algunas excepciones al general “Sí, es posible” (posiblemente muchas de ellas con Prolog y lenguajes esotéricos como Brainf * ck).

Pero, como ejemplo, PODRÍAS implementar n! en el ejemplo Haskell de Ethar Alali imperativamente, como en la versión C # que proporcionó, utilizando la Mónada del Estado. Haskell, como lenguaje, no fomenta la programación imperativa, pero PUEDE hacerlo si realmente lo desea, simplemente da como resultado un código más complicado y avanzado, en general.

¿Dentro de un solo paradigma? Más o menos. Por ejemplo, es sencillo traducir el pseudocódigo del paradigma imperativo de decir Introducción a los algoritmos entre los clones de Fortran: C, Java, JS, Ruby, Python y todo lo demás.

Pero cuando pasa a un paradigma funcional puro (Haskell o esquema puro), o programación lógica, etc., entonces puede que tenga que hacer un replanteamiento profundo.

“Algoritmo” significa “una forma de hacer algo”.

¿Agregar dos números es lo mismo en todos los lenguajes de programación? La redacción puede ser diferente, pero es básicamente “A + B = C”. Shakespeare no se ve igual en francés, pero sigue siendo Shakespeare, ¿no?

(No hay un “conjunto de algoritmos”: los programas consisten en algoritmos y estructuras de datos, pero cualquiera puede escribir cualquier algoritmo para hacer cualquier cosa que la computadora sea capaz de hacer. Y algunas cosas no son evidentes: el 8048 [IIRC] no tiene “comparación” instrucción, pero aún puede comparar 2 valores, simplemente no es tan simple como “comparar A y B”).

En general si.

Ocasionalmente, hay algunos algoritmos que no se pueden implementar en un idioma en particular, pero eso es raro.

Lo que es más común es que algunos algoritmos pueden no ser muy eficientes en un idioma, por lo que puede elegir uno diferente.

Pero sobre todo, un algoritmo es independiente del idioma en el que elige codificarlo.

More Interesting

¿Por qué está completo el problema de la mochila NP incluso cuando tiene complejidad O (nW)?

Un algoritmo de cifrado de bloque en su forma básica casi nunca se usa para cifrar mensajes largos. ¿Por qué?

Cómo comprender la recursividad en backtracking de campo profundo y todo relacionado, programación dinámica, etc.

Cómo aprender 'algoritmos' sobre los que el mundo tecnológico está hablando y aplicarlos a mi vida cotidiana

¿Hay algoritmos con complejidad [math] \ mathcal {O} [/ math] [math] (\ sqrt {\ log (n)}) [/ math]?

¿Con qué tipo de algoritmo debo comenzar desde el principio?

¿Es seguro decir que un algoritmo iterativo es mejor que el recursivo para el mismo problema dado que ambos son de la misma complejidad temporal?

¿Hay alguna prueba de que los algoritmos de clasificación no pueden tener una complejidad mejor que O (Nlog (N))?

¿Cómo hace un algoritmo para hacer objetos en movimiento a partir de fotos?

¿La informática es solo sobre programación y algoritmos?

¿Qué algoritmos de máquina requieren escala / normalización de datos?

¿Cuáles son las cosas básicas en estructuras de datos y algoritmos que debo saber para las ubicaciones en el campus?

¿La técnica de dos punteros se considera una búsqueda binaria en algunos problemas?

¿Debo comenzar a aprender estructuras de datos y algoritmos en lugar de nuevos lenguajes de programación?

¿Existe un algoritmo eficiente para enumerar todos los ciclos dentro del Componente fuertemente conectado de un gráfico dirigido?