Tejiendo algoritmos
Tomo I: Abstracción, crítica, secuencias y árboles
Leandro Rabindranath León Centro de Estudios en Microelectrónica y Sistemas Distribuidos Departamento de Computación Universidad de Los Andes 1 de julio de 2011
Hasta el momento en que redacto estas humildes líneas, aún me puedo ufanar de que a todos mis estudiantes, en el sentido académico, pero también creo que en sudevenir, les ha ido muy bien. Bien valga pues hacia ellos el dedicarles este trabajo
Prefacio
Quisiera que este texto se considerase como un “vademecum” en el diseño efectivo y en la programación de algoritmos y de estructuras de datos que soporten programas computacionales. Vademécum es una palabra latina construida mediante el imperativo latín vade que connota “ven”, “anda” o “camina”, ymecum, que significa “conmigo”. Aprender es parecido a transitar un camino; enseñar es parecido a mostrárselo a un peregrino. Enseñar proviene del latín “insign¯ re”, verbo coma puesto de “in” (en) y “signare” (señalar); la expresión aún se emplea cuando se señala con el dedo una senda a seguir. Así, un vademecum pretende ser una guía de “tránsito” por una senda de aprendizaje; en este caso, la deprogramación de computadoras.
Modo y medios
Permítaseme introducir el modo de enseñanza de este texto, expresado por este antiquísimo proverbio oriental: “Cuando escucho, olvido, Cuando veo, recuerdo, Cuando hago, entiendo.” La apropiación efectiva de un conocimiento ocurre cuando éste se “entiende”. El entendimiento se torna realidad cuando un aprendiz consuma la hechura de cosascaracterísticas de su práctica haciéndolas él mismo. Dicho de otra manera, el modo de enseñanza es mostrar enteramente cómo se elabora una estructura de datos y un algoritmo. Bajo este modo intentaré guiar a un potencial aprendiz por el camino de la práctica de la programación avanzada. Para ello empleo algunos medios. ix
x
C++
LEANDRO RABINDRANATH LEÓN
Para representar los algoritmos y lasespecificaciones de estructuras de datos empleo el lenguaje de programación C++ . Esta decisión no se tomó sin dignas objeciones, las cuales, resumidamente, se pueden clasificar en dos grupos. El primero cuestiona el eventual desconocimiento del lector sobre el lenguaje C++ . A esto debo replicar que no sólo C++ es uno de los lenguajes más populares e importantes de la programación de sistemas, sino que susintaxis y semántica son reminiscentes a la mayoría de los otros lenguajes procedurales y a objetos. De hecho, en el quórum actual de los lenguajes de programación procedurales no sólo domina C++ , sino que el resto de los lenguajes se inspiran en él o en su precursor, el lenguaje C; por instancias, java, python, perl, C# y D. El segundo tipo de objeción denuncia que la comprensión se torna másdificultosa, a lo cual replico con dos argumentos. El primero es que los lenguajes de programación se pensaron también en un estilo “coloquial”1 respecto a la programación. Consideremos, por ejemplo, el siguiente pseudoprograma en un pseudolenguaje castellano:
Repita mientras m > 0 y m < n si a[m] < a[x] entonces m = m/2; de lo contrario m = 2*m fin si Fin repita mientras
el cual es equivalente a latraducción literal, “coloquial”, del siguiente bloque en C++ :
while (m > 0 and m < n) { if (a[m] < a[x]) m = m/2; else m = 2*m; }
Aunque un ejemplo no basta para generalizar mi defensa sobre el uso del lenguaje C++ , el hecho es que cualquiera que considere seriamente la programación tendrá que programar y esto deberá hacerlo en un lenguaje de programación, el cual, para bien o mal, fuepensado en lengua inglesa. Por tanto, inevitablemente, un aprendiz hispanoparlante deberá programar en un lenguaje de programación “anglizado”. Hecha la acotación anterior, también podemos decir que el programa en
1 Es
imposible ser completamente coloquial en un lenguaje de programación.
PREFACIO
xi
castellano y su equivalente en C++ tienen el mismo significado. Así pues, es dudoso,...
Regístrate para leer el documento completo.