¿Qué paradigma entre funcional, imperativo y POO es más similar a la forma en que pensamos?

Programación funcional sin duda.

Supongamos que te pregunto “¿Cómo funciona quicksort?”

Lo más probable es que responda con algo similar a “Particula una matriz basada en un elemento elegido al azar para que todos los elementos de la izquierda sean menores que el pivote y todos los de la derecha sean mayores que él. Y luego se repite en el lado izquierdo y derecho de la matriz “.

En programación funcional, literalmente haces eso. Divide la matriz y recurse.

Pero eso no es lo que sucede en la programación imperativa.

En la programación imperativa, debe definir cómo va a hacer que el lado izquierdo de la matriz sea más pequeño que el pivote y cómo hacer que el lado derecho sea más grande. Debe hacer esto definiendo enteros [math] i [/ math] y [math] j [/ math], luego repita a través del lado izquierdo de la matriz hasta que encuentre un elemento en el lugar equivocado, y nadie piense como ese.

La programación funcional es una forma de programación altamente abstracta, lo suficientemente abstracta como para emular el pensamiento humano más de lo que haría la programación imperativa.

Para afirmar mi punto sobre las clasificaciones rápidas, mire las versiones Haskell y C de clasificaciones rápidas: Haskell

Creo que los lenguajes de programación con un estilo declarativo son mucho más naturales y más cercanos a nuestra forma de pensar, y mucho menos detallados. En la programación declarativa, usted describe lo que debe hacerse en lugar de cómo hacerlo. La programación funcional tiene un estilo declarativo que es una característica altamente deseable. Hace que sus programas sean más fáciles de escribir y más fáciles de entender por otros. Los programas funcionales son concisos y generalmente una fracción del tamaño de sus contrapartes imperativas. Otro paradigma de programación que es declarativo es la programación lógica. Un ejemplo de lenguaje de programación lógica es el prólogo. En prolog, el código es solo un conjunto de hechos y reglas que describen un cálculo. Por lo general, es bastante simple traducir el lenguaje natural a prolog. Aquí está el código de prólogo para quicksort:

más pequeño (_, [], []).
más pequeño (X, [H | T], [H | R]): –
X> = H, más pequeño (X, T, R).

más pequeño (X, [H | T], R): –
X

mayor (_, [], []).
mayor (X, [H | T], [H | R]): –
X

mayor (X, [H | T], R): –
X> = H, mayor (X, T, R).

qsort ([], []).
qsort ([H | T], R): –
más pequeño (H, T, S), mayor (H, T, G), qsort (S, SS), qsort (G, SG), agregar (SS, [H], X), agregar (X, SG, R )

Lo que hace es simplemente tomar el encabezado de la lista como pivote, encontrar los elementos, más pequeños o iguales al pivote y ordenarlos. Luego encuentra los elementos más grandes que el pivote y los ordena, luego agrega todo junto. Como puede ver, no hay que jugar con punteros, índices o bucles. Simplemente construcciones abstractas de alto nivel.

OOP fue desarrollado para ser similar a la intuición natural de las personas sobre el mundo. Alok Tripathy ofrece una gran respuesta en el contexto de la clasificación rápida, pero en el contexto de, digamos, pac man, es más difícil imaginar un paradigma funcional.

El mundo real está orientado a objetos …

Hay clases de objetos, y herencia, hay interfaces y encapsulación.
Incluso hay herencia múltiple (como en la reproducción sexual).

En su mayoría, piensa en algo en términos de lo que puede hacer con él (interfaz). Muchas cosas no son tan accesibles como las entrañas de una máquina (encapsulación)