Introducción a la programación a un matemático [cerrado]

30

Actualmente soy programador, tengo casi 16 años y he reducido mis carreras a algo relacionado con un título en Ciencias de la Computación o Ingeniería Eléctrica (sé que son bastante diferentes, pero esta pregunta es sobre mi amigo), pero mi amigo no está tan seguro

Está muy interesado en las matemáticas y es muy bueno en eso, y creo que disfrutaría de la programación, pero no está dispuesto a probarlo ( editar , está dispuesto a intentarlo pero nunca lo ha hecho antes). ¿Alguien puede darme sugerencias para un lenguaje o herramienta que podría incursionar en la programación (supongo que a un nivel razonablemente básico) para resolver problemas matemáticos o involucrar algún tipo de matemática.

Como digo, disfruta mucho de las matemáticas, pero creo que disfrutaría de la programación, el problema es que no quiero que se desanime por las cosas que no son relevantes en los niveles introductorios, como la asignación de memoria, etc. Sé que eso es muy importante, pero el punto es que quiero que aprenda un poco de programación con las matemáticas y, con suerte, si está lo suficientemente interesado, puede comenzar a aprender programación como programación.

Editar: No es que no esté completamente interesado, más que no haya explorado activamente el área antes, tal vez porque no está informado al respecto. No me gustaría obligarlo a hacer algo que no quiere, veo esto como un pequeño empujón para que pueda aprender sobre programación. Si no le gusta, lo suficientemente justo, no puedo controlar eso y no quiero, pero si resulta que lo disfruta, este impulso habrá sido lo correcto.

ell
fuente
17
¿Por qué quieres empujar a tu amigo en una dirección que no le interesa?
HLGEM
3
Para el registro, muchos de los programadores con los que he trabajado tienen títulos en matemáticas. Además de eso, son bastante buenos.
AngryBird
1
Estoy de acuerdo con @HLGEM. Odiaría si alguien me empujara hacia la matemática pura y teórica. Del mismo modo, aquellos que deseen esas cosas lo odiarían si fueran empujados hacia las cosas aburridas aplicadas.
Trabajo
44
Para poner algo de perspectiva sobre las cosas: tienes 16 años. No eres un programador, eres un estudiante que ha hecho algo de programación. Tu amigo no es matemático, es un estudiante al que le gustan (y ha aprendido algo) las matemáticas. Si bien me gusta la respuesta de @ perl.j, creo que puede ser exagerado en este caso.
Joel Etherton
2
@ perl.j: Hasta que alguien tenga el grado necesario para mostrar el "área principal de estudio" como evidencia, no es matemático. Incluso alguien en la universidad cuya especialidad es matemática aún no es matemático.
Joel Etherton

Respuestas:

60

Logotipo de matemáticas

Si quieres un lenguaje "matemático", Haskell es tu mejor amigo (para tu mejor amigo). Puede crear fácilmente nuevas funciones sin problemas. Es la mejor recomendación de idioma que puedo darle para su amigo. Aquí hay algunos enlaces:

Mathematica

Wolfram's Mathematica es otro interés que puede tener.

Mathematica is a computational software program used in scientific, engineering, and mathematical fields and other areas of technical computing. It was conceived by Stephen Wolfram and is developed by Wolfram Research of Champaign, Illinois.

Aunque es caro, vale la pena. Aquí hay algunos enlaces:

Algoritmos

Los algoritmos son importantes para cualquier programa, pero su amigo debe comenzar con estos cuando se sienta cómodo con un idioma. Aquí hay algunos enlaces más:

¡Espero que esto ayude! Si tiene alguna pregunta o comentario, ¡no dude en comentar! Por cierto, todos estos enlaces son para liberar recursos. Si quieres un libro impreso, tengo algunas recomendaciones, ¡solo deja un comentario!

dinámico
fuente
2
Soy un experto en matemáticas, y puedo recomendar Haskell como increíble desde una perspectiva matemática. También me gusta leer algunas de las cosas teóricas que lo acompañan, mucho más que la mayoría de los idiomas.
Theo Belaire
2
Si aprende Haskell, puede incluso pasar a Agda , un lenguaje de tipo dependiente adecuado para hacer pruebas.
Peter C
44
@ SK-logic ¿Cómo puedes decir eso? Las matemáticas tienen que ver con aprender nuevos sistemas lógicos y razonar sobre ellos (no olvide que los matemáticos inventaron la máquina de Turing). ¿Honestamente crees que alguien que puede manejar las matemáticas no puede manejar la idea de la mutación variable? ¡Y mi punto es que hacer algo tan simple como la mutación variable en Haskell requiere una mónada de la tienda! Decir que es más fácil de lo que x = x + 1es ridículo.
JeremyKun
2
@Bean, esa fue en realidad mi primera reacción a una declaración de asignación (y no sabía nada más que ecuaciones lineales primitivas de las matemáticas en ese entonces). Desde entonces vi la misma reacción repetidamente. Intenté deliberadamente introducir conceptos de programación funcional a aquellos que no tenían experiencia previa en programación, pasando gradualmente a lo imprescindible. Siempre fue fácil primero, y todo eso "WTF?!?" El aspecto siempre comenzó solo con la introducción de los conceptos imperativo y OOP.
SK-logic
18

La programación funcional y los lenguajes de la familia ML o Haskell tienden a encajar bastante bien en las mentes de los matemáticos.

Un programador
fuente
¡Muy cierto! Listas infinitas y todo lo que es genial para las mentes matemáticas.
14

Si se especializa en matemáticas, sin duda terminará haciendo bastante programación, si no en lenguajes de bajo nivel como C ++, luego en lenguajes de nivel superior, específicos de matemática, como Maple o Mathematica dependiendo de lo que esté haciendo.

Además, dependiendo de su área de investigación, puede terminar haciendo matemática aplicada o análisis estático, los cuales requerirán una cantidad significativa de programación. Es mejor acostumbrarse a la programación ahora, independientemente de lo que decida.

minuto
fuente
1
También puedes intentar meter a Python en su mente con Sage ( sagemath.org ).
Anton Barkovsky
Aquí hay otro lenguaje específico de matemáticas de nivel superior: math.uiuc.edu/Macaulay2
RyanTM
Te sugiero que solo le permitas descubrir la programación. Cuando está expuesto a él, y ciertamente se le pedirá que haga algo que le obligue a hacer algo en un lenguaje matemático específico, le gustará o lo odiará. Si le gusta cuando esto sucede, podrá seleccionar los idiomas que mejor se adapten a él. No es que no debas ayudar a tu amigo, si no ha mostrado interés, debes abandonarlo.
Ramhound
12

Enséñale a Haskell. Es un lenguaje donde puedes pensar igual que en matemáticas:

  • Una función es algo que asigna entrada a salida
  • Las cosas se evalúan según sea necesario
  • Inferencia de tipos y un sistema de tipos loco
  • Sintaxis conveniente
  • Gran comunidad (por ejemplo, en StackOverflow )
  • Mónadas

Te sugiero que le muestres http://learnyouahaskell.com , uno de los mejores tutoriales para Haskell.

FUZxxl
fuente
11

Como alguien que estudió matemáticas (tengo una licenciatura en matemáticas puras y acabo de recibir mi maestría en matemáticas aplicadas / estadística) y luego me di cuenta de la diversión / practicidad / importancia de la programación más adelante en mi carrera, realmente aprecio esta pregunta. Desearía tener un amigo como tú hace 10 años para empujarme hacia la programación.

Ambos deberían consultar el Proyecto Euler . ¿Qué es?

El Proyecto Euler es una serie de desafiantes problemas matemáticos / de programación de computadoras que requerirán más que solo conocimientos matemáticos para resolver. Aunque las matemáticas te ayudarán a llegar a métodos elegantes y eficientes, se requerirá el uso de una computadora y habilidades de programación para resolver la mayoría de los problemas.

Aunque no es una sugerencia específica del idioma, sería un gran motivador para comenzar a programar (especialmente si ya hay un interés en las matemáticas). Los problemas comienzan muy fácil y accesible pero rápidamente se vuelven muy difíciles y / o difíciles. Un buen desafío y motivación que es probable que ambos disfruten.

En cuanto a qué lenguaje usar, tengo experiencia con C ++, R, Matlab y Mathematica, que son geniales y ampliamente utilizados dentro de la comunidad matemática. Pero más específicamente, le sugiero que aprenda Python, que es muy útil para las matemáticas, pero no está tan restringido a las matemáticas como algunos de los otros (en caso de que quiera más opciones más adelante en la vida). Es fácil comenzar con Python, pero hay toneladas de cosas que aprender. También es gratis a diferencia de algunos de los otros. C ++ también podría ser una buena opción, pero podría tener más obstáculos desde el principio.

bnjmn
fuente
+2 para el Proyecto Euler, iba a agregar como un comentario sobre la pregunta principal hasta que vi su respuesta. OP y su amigo definitivamente deberían entrar en esto juntos.
cobaltduck
10
  • Para los matemáticos, la mayor activación son los algoritmos. Tu amigo debe comenzar a implementarlos en Python (es amigable).

  • Los entornos informáticos numéricos como MATLAB serán útiles para manipulaciones matriciales, trazado de funciones y datos, implementación de algoritmos.

SHOUBHIK BOSE
fuente
10

Depende del área de matemáticas que le interese.

Si le gusta más el álgebra abstracta o la combinatoria, probablemente le gustaría Haskell ya que el sistema de tipo complejo permite la programación directa de una variedad de matemáticas. ATS también podría ser una opción.

Recomiendo Learn You a Haskell for a Great Good para un tutorial de introducción y estructuras de datos puramente funcionales para algoritmos.

Si le gustan más el análisis matricial, las ecuaciones diferenciales o los sistemas dinámicos, le recomendaría Matlab , NumPy u Octave . APL es a través de Dyalog también podría ser de interés; aunque no lo comenzaría con eso. Las recetas numéricas , mientras que en C ++ se pueden adaptar para servir como una buena guía de algoritmos.

Si quiere hacer estadísticas, entonces R es la opción natural.

Ingeniero mundial
fuente
5

Soy un estudiante graduado en matemáticas, e hice mi licenciatura en ciencias de la computación. Mantengo un blog llamado Math ∩ Programming en el que exploro las aplicaciones de las matemáticas a la programación (y viceversa), y debo admitir que encuentro que la mayoría de los aspectos menos matemáticos de la informática son bastante secos y poco inspirados (básicamente, mi oposición a todos los trucos ridículos que entran en la programación de sistemas en mi experiencia en la industria).

Por otro lado, en mi blog miro problemas como el reconocimiento facial (bastante álgebra lineal), métodos de encriptación, máquinas Turing y autómatas celulares, modelos para predecir la actividad de los asesinos en serie, motores de búsqueda y muchos otros conceptos matemáticos. . ¡La mejor parte es que puedo implementar las ideas, y cualquiera de las mías!

Para obtener su amigo para la programación amor al igual que el resto de nosotros, a encontrar una verdaderamente interesanteproyecto. El aspecto de la programación no se mantendrá sin su trabajo hacia un producto que encuentre hermoso. En cuanto a los idiomas, recomiendo Mathematica, Racket (un derivado de Scheme muy amigable, pero aún poderoso), Python y Haskell. Mathematica es probablemente el mejor, porque puede implementar selectivamente sus propias funciones matemáticas y usar las bibliotecas integradas de Mathematica para finalizar el proyecto (por ejemplo, escribir una función que calcule los coeficientes de Fourier y luego usar Mathematica para hacer el resto del análisis, como como filtrado, generación de imágenes, etc.). Incluso los temas básicos como la integración ofrecen algunos proyectos fascinantes (diferentes reglas de cuadratura, integración de Monte Carlo, una transición suave al aprendizaje automático con grandes conjuntos de datos).

Además, parece que muchas de las respuestas aquí provienen de personas que no hacen matemáticas o que no han usado los lenguajes que sugieren que usen software matemático. La razón por la que la gente recomienda a Haskell es porque es lo más parecido posible a una implementación literal de la teoría de categorías y encaja bien con algunas definiciones matemáticas de algunos conceptos básicos. Pero si su amigo es cercano a su edad, entonces no está preparado para la teoría de categorías matemáticamente (esa madurez es más o menos inútil hasta la escuela de posgrado, y es muy difícil de aprender), y como primer idioma Haskell tiene la mayor inclinacióncurva de aprendizaje de los idiomas sugeridos (tal vez Prolog es más pronunciado). Utilicé Haskell para implementar un compilador de Javascript, y terminé con un código elegante muy hermoso, pero para cosas intuitivas como la mutación variable, ya tienes que incursionar en mónadas no triviales.

Python y Mathematica serán mucho más amigables, y Mathematica tiene la curva de aprendizaje más superficial simplemente porque todas las bibliotecas están empaquetadas en una interfaz de usuario agradable con una documentación impresionante (¡simplemente presione F1!). Por otro lado, hay un libro del que he oído hablar (pero que no he leído) que proporciona tanto una transición a las matemáticas avanzadas como una introducción a Haskell simultáneamente . Parece que tiene críticas positivas de Amazon, por lo que es posible que desee verlo. Puede pasar a lenguajes como C # y Java si alguna vez quiere hacer cosas de la industria, pero es más probable que nunca necesite ingresar a esa jungla (y muchas cosas de matemáticas de la industria son Matlab puro de todos modos).

Pero como dije, con el proyecto correcto aprender el idioma se convierte en una alegría, sea cual sea el proyecto.

JeremyKun
fuente
3

Si su amigo disfruta de la lógica formal y encuentra interesante la Inteligencia Artificial, le gustaría echar un vistazo a Prolog .

Con este lenguaje, usted establece sus predicados (suposiciones iniciales, "hechos") y sus reglas de inferencia ("relaciones"), y luego hace preguntas.

Luego, Prolog se apaga y determina si la pregunta se puede responder utilizando solo los hechos y las relaciones, y si es así, le dice la respuesta.

Entonces le dices que "Tom es un gato" y "todos los gatos son animales" y preguntas "¿Tom es un animal?" y obtendrás la respuesta "verdadero".

O puede pedirle que "enumere todos los animales que conoce" y obtendrá la lista de elementos "tom".

Por supuesto, la sintaxis es un poco más complicada que eso, pero se entiende la idea general.

Bill Michell
fuente
Prolog es frustrantemente cercano a la lógica de primer orden, pero realmente incompatible, ya que no tiene forma de distinguir entre "no comprobado" y "falso". Es un lenguaje ordenado en algunos aspectos, pero no lo presionaría a un matemático y lo llamaría lógica de programación.
David Thornley
¿No puedes simplemente probar la negación?
Bill Michell
2

La mejor manera de alentar a tu amigo a intentarlo podría ser que comience a programar sin pensar demasiado en el hecho de que está programando.

Una vez que esté listo para lidiar más con la "programación", ambos pueden comenzar con el mismo libro y aprender a programar desde una base más matemática. Dos de mis libros favoritos actuales son:

SICP se puede ver libremente en el sitio web de MIT Press .

Si tu amigo tiene una inclinación matemática, Lisp no presentará ninguna dificultad y te liberará de tener que aprender cualquier sintaxis especial. Creo que Lisp es más fácil de aprender que Haskell.

El programador
fuente
1

Estoy de acuerdo con Haskell, pero desde un punto de vista práctico, también debería aprender un idioma en una máquina abstracta muy utilizada. Me refiero a un lenguaje JVM o lenguaje .NET, por supuesto.

Hay idiomas en estas plataformas que son un poco más interesantes que los idiomas emblemáticos. En la JVM, eche un vistazo a Clojure y Scala. En la plataforma .NET, eche un vistazo a F #.

También había un lenguaje .NET de Microsoft Research llamado c-omega que era muy interesante, pero que era solo un proyecto de investigación.

dsmith
fuente
1

Matlab se usa comúnmente para la programación matemática y científica. Es un lenguaje basado en script, no es difícil de aprender y todos los problemas de memoria están ocultos para el usuario.

La ingeniería de software y la ingeniería eléctrica se pueden combinar en ingeniería informática.

Danny Varod
fuente
0

Si su amigo no está dispuesto a probar la programación, no veo por qué quiere forzar el problema. Creo que una clave para ser programador es estar dispuesto a aprender, y si él no está dispuesto a aprender, entonces la programación probablemente no sea para él

Pero dicho esto, su mejor opción podría ser crear un pequeño programa usted mismo y mostrárselo. Quizás deje algunas partes sin terminar y vea si puede interesarlo para que lo ayude a terminarlo. Lo sé para mí, los algoritmos y la lógica detrás de un programa son mucho más interesantes que escribir la sintaxis, así que tal vez intente que le ayude con la lógica del programa, y ​​luego vaya y codifique la cosa y déjelo ver el resultados de la misma.

Si muestra algún interés en el código fuente, muéstrele cómo escribir sus propias cosas. Personalmente, creo que el lenguaje en sí no importa siempre que sea fácil de aprender y tenga mucha documentación.

Rachel
fuente
0

Hay toda una biblioteca matemática y comunidad gratuitas construidas alrededor de Python. Comenzaría con "Sage", realmente debería disfrutar de usarlo y aprenderá a programar en Python por cierto.

Bill K
fuente
0

Creo que deberías mostrarle a tu amigo algunas variantes diferentes, como:

  • do
  • LISP / Esquema
  • BASIC
  • bourne-shell
  • Prólogo

Creo que C y LISP son buenos puntos de partida, que muestran que diferentes lenguajes pueden ser más adecuados para diferentes tareas. No creo en usar Haskell o Erlang para todo.

El código de máquina (o ensamblador) para un procesador simple también puede ser interesante. Siempre me ha encantado haber comenzado con el código de máquina en mi primer C64 . ( MOS 6510 ) Experiencia práctica que es difícil de obtener como adulto con un tiempo limitado para "desperdiciar".

MattBianco
fuente
Tengo que estar en desacuerdo. ¿Por qué un niño joven, interesante en matemáticas, se sentiría atraído por el código de la máquina? ¿Y por qué C? El ensamblaje supone demasiado conocimiento sobre los procesadores. C también establece muchos requisitos que es mejor dejar a alguien que quiera aprender programación seria: punteros, registros, alcance, tipos. Para una primera introducción a la programación para esa persona, es mucho mejor algo que se centre en algoritmos o en aplicaciones de ideas matemáticas (probabilidad, aleatoriedad, simulaciones). Python, Lisp / Forth, incluso básico. Bourne-shell? ¿Por qué? ...
Assad Ebrahim
0

Para mí, la programación comienza por querer "hacer algo", un "¿y si?" pregunta:

  • "Me gustaría crear mi propio sitio web", así que aprenda sobre HTML, etc.

  • "Odio tener que hacer clic en X o que veo Y en este sitio web cada vez que lo visito. ¿No hay una manera de automatizar eso?" Entonces aprende sobre bookmarklets o escribir extensiones de navegador.

  • "Quiero catalogar toda mi música y ninguna de las herramientas que he visto lo hace de la manera que quiero", para que aprendas sobre las bases de datos.

  • "Quiero hacer un seguimiento de los gastos de mi Club de Matemáticas", para que aprenda sobre hojas de cálculo, macros de programación o incluso bases de datos.

Para que la unidad realmente esté allí, el problema subyacente tiene que venir de él. . Intentaría encontrar un problema que él quiera resolver y luego elegir una herramienta / idioma / sistema que le permita automatizar / programar la solución.

David Weinraub
fuente
-2

Haskell y Mathematica son el camino a seguir, en mi opinión. La mayoría de los lenguajes funcionales también son buenos para las matemáticas. Python también es bueno, revisa la documentación matemática .

Este módulo siempre está disponible. Proporciona acceso a las funciones matemáticas definidas por el estándar C.

Estas funciones no pueden usarse con números complejos; utilizar las funciones del mismo nombre de la módulo cmath si necesita soporte para números complejos. La distinción entre funciones que admiten números complejos y aquellas que no lo hacen se hace ya que la mayoría de los usuarios no quieren aprender tantas matemáticas como sea necesario para comprender números complejos. Recibir una excepción en lugar de un resultado complejo permite la detección temprana del número complejo inesperado utilizado como parámetro, para que el programador pueda determinar cómo y por qué se generó en primer lugar.

Las siguientes funciones son proporcionadas por este módulo ...

Billjk
fuente