An Elementary Introduction to the Wolfram Language
29Más sobre las funciones puras
Se ha visto ya cómo formar listas y arreglos con Table. También las funciones puras pueden utilizarse para ese propósito, usando Array.
Genere un arreglo de 10 elementos mediante una función abstracta f:
In[1]:=
Click for copyable input
Out[1]=
In[2]:=
Click for copyable input
Out[2]=
Table permite obtener el mismo resultado, aunque en ese caso habría que introducir la variable n:
In[3]:=
Click for copyable input
Out[3]=
Array[f,4] forma una lista sencilla de 4 elementos. Array[f,{3,4}] forma un arreglo de 3×4.
Haga una lista de longitud 3, donde cada uno de sus elementos sea una lista de longitud 4:
In[4]:=
Click for copyable input
Out[4]=
In[5]:=
Click for copyable input
Out[5]=
En el caso de que la función fuera Times, Array construiría una tabla de multiplicar:
In[6]:=
Click for copyable input
Out[6]=
Y, ¿si se quiere usar una función pura en vez de Times? Cuando se calcula Times[3,4], se está indicando que Times se aplique a dos argumentos. (En Times[3,4,5], Times se aplica a tres argumentos, etc.). En una función pura, #1 representa al primer argumento, #2 al segundo argumento, y así sucesivamente.
#1 representa el primer argumento, #2 el segundo argumento:
In[7]:=
Click for copyable input
Out[7]=
#1 siempre elige el primer argumento, y #2 el segundo argumento:
In[8]:=
Click for copyable input
Out[8]=
Ahora se podrá usar #1 y #2 dentro de una función en Array.
Use una función pura para formar una tabla de multiplicar:
In[9]:=
Click for copyable input
Out[9]=
Use una función pura diferente que ponga una x siempre que los números sean iguales:
In[10]:=
Click for copyable input
Out[10]=
Aquí se ve el cálculo equivalente efectuado mediante Table:
In[11]:=
Click for copyable input
Out[11]=
Vistas las funciones puras con más de un argumento, se puede comenzar a ver FoldList. Puede considerarse a FoldList como una generalización de NestList cuando se tienen dos argumentos.
NestList toma una función individual, tal como f, y la va anidando sucesivamente:
In[12]:=
Click for copyable input
Out[12]=
In[13]:=
Click for copyable input
Out[13]=
NestList simplemente aplica de nuevo una función al resultado obtenido en el último paso, cualquiera que sea. FoldList hace lo mismo salvo que, adicionalmente, incorpora un nuevo elemento cada vez.
Aquí se presenta FoldList con una función abstracta f:
In[14]:=
Click for copyable input
Out[14]=
Si se usa la función Framed se hace un poco más fácil comprender lo que sucede:
In[15]:=
Click for copyable input
Out[15]=
De entrada, esto puede parecer complicado y oscuro, y se hace difícil imaginar de qué manera podría ser útil. Sin embargo, efectivamente lo es, y es también insospechadamente común en programas reales.
FoldList es muy apropiado para acumular cosas progresivamente. Tómese de entrada un caso sencillo: sumar números progresivamente.
En cada paso FoldList incorpora otro elemento (#2), añadiéndolo al resultado que se ha obtenido hasta ese momento (#1):
In[16]:=
Click for copyable input
Out[16]=
Aquí se despliega el proceso que se va llevando a cabo:
In[17]:=
Click for copyable input
Out[17]=
O, de manera equivalente:
In[18]:=
Click for copyable input
Out[18]=
In[19]:=
Click for copyable input
Out[19]=
Desde luego, este caso es demasiado sencillo y no se necesita recurrir a una función pura:
In[20]:=
Click for copyable input
Out[20]=
Un uso clásico de FoldList es en la incorporación sucesiva de dígitos para reconstruir un número a partir de la lista de sus dígitos.
Construya un número, de manera sucesiva, a partir de sus dígitos, comenzando el proceso de incorporación con el primer dígito:
In[21]:=
Click for copyable input
Out[21]=
Por último, se usará FoldList para incorporar imágenes progresivas de una lista, añadiendo una, en cada paso, con ImageAdd a la imagen obtenida hasta ese momento.
Incorpore progresivamente imágenes de una lista, usando ImageAdd para combinarlas:
In[22]:=
Click for copyable input
Out[22]=
Al principio, el concepto de FoldList no es lo más sencillo de comprender. Pero una vez que se adquiere familiaridad con él, se habrá aprendido una técnica por demás poderosa de la programación funcional, que ejemplifica el tipo de abstracción elegante que se hace posible con Wolfram Language.
29.1Use Prime y Array para generar la lista de los 100 primeros primos. »
Salida esperada:
Out[]=
29.2Use Prime y Array para encontrar las diferencias sucesivas entre los 100 primeros primos. »
Salida esperada:
Out[]=
29.3Use Array y Grid para formar una tabla de sumar de 10 por 10. »
Salida esperada:
Out[]=
29.4Use FoldList, Times y Range para multiplicar los números hasta el 10 sucesivamente (formando los factoriales). »
Salida esperada:
Out[]=
29.5Use FoldList y Array para calcular los productos sucesivos de los 10 primeros primos. »
Salida esperada:
Out[]=
29.6Use FoldList para aplicar ImageAdd sucesivamente a los polígonos regulares de 3 a 8 lados, con opacidad 0.2. »
Salida esperada:
Out[]=
+29.1Use Array para formar una rejilla de 10 por 10, donde los elementos en la diagonal principal y abajo de ella sean 1, y el resto sean 0. »
Salida esperada:
Out[]=
¿Qué significa # por sí solo?
Es equivalente a #1, una ranura que se llena con el primer argumento de una función.
¿Cómo se dice #1?
¿Se pueden denominar los argumentos de una función pura?
Sí. Eso se hace con Function[{x, y}, x+y], etc. A veces está bien hacerlo así para mejorar la legibilidad del código, pero a veces es necesario cuando se anidan funciones puras.
¿Puede Array formar estructuras con anidación de mayor profundidad?
Sí, con tanta profundidad como se desee. Listas de listas de listas... hasta cualquier número de niveles.
Es un paradigma de programación basado en evaluación de funciones y en combinaciones de funciones. De hecho, es el único estilo de programación que se ha visto en el libro hasta el momento. En la Sección 38 se verá la programación por procedimientos, basada en moverse a través de algún procedimiento en el que se van cambiando progresivamente los valores de las variables.
 
Download Notebook Version
en