Agregando a la gran respuesta de perimosocordiae, los idiomas como Haskell son tan hábiles que le permiten hacer una lista infinita de listas infinitas.
En primer lugar permite definir el operador que produce cada fila sucesiva:
op :: [Integer] -> [Integer]
op = scanl1 (+)
Como se explica por perimosocordiae, esto es sólo una suma continua perezoso.
También necesitamos un caso base:
tnBase :: [Integer]
tnBase = [0..]
Entonces, ¿cómo obtener una lista infinita de infinitas listas de números tetraédricos? Iteramos esta operación en el caso base, la salida producida por el caso base, a continuación, que la producción ...
tn = iterate op tnBase
iterate
está en el preludio, dichas funciones pueden encontrarse usando Hoogle y searching by name (si tiene una buena suposición) o type signature (generalmente conoce la firma de lo que necesita). Source code generalmente se vincula desde haddock documentation.
Presentación
(en caso de que no se siente cómodo con el mapa, tomar, gota, y la cabeza)
Todo esto está muy bien, pero bastante inútil si usted no sabe cómo pasar la primera lista infinita para ver el segundo, tercero, etc.Hay un montón de opciones, para conseguir justo una lista en particular se puede soltar el primer pocos:
getNthTN n = head (drop n tn)
Obtención de los primeros resultados de cada lista es probablemente más de lo que estás buscando sin embargo:
printFirstFew n m = print $ take m (map (take n) tn)
Aquí map (take n) tn
tomará los primeros valores n
de cada lista de números tetraédricos, mientras que take m
limitará nuestros resultados a las primeras listas m
.
Y por último, me gusta el groom paquete impresionante para juego interactivo rápida con los datos:
> groom $ take 10 (map (take 10) tn)
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45],
[0, 1, 4, 10, 20, 35, 56, 84, 120, 165],
[0, 1, 5, 15, 35, 70, 126, 210, 330, 495],
[0, 1, 6, 21, 56, 126, 252, 462, 792, 1287],
[0, 1, 7, 28, 84, 210, 462, 924, 1716, 3003],
[0, 1, 8, 36, 120, 330, 792, 1716, 3432, 6435],
[0, 1, 9, 45, 165, 495, 1287, 3003, 6435, 12870],
[0, 1, 10, 55, 220, 715, 2002, 5005, 11440, 24310],
[0, 1, 11, 66, 286, 1001, 3003, 8008, 19448, 43758]]
Para más información sobre por qué le pregunté: Tengo un conjunto de buckyballs (http://www.getbuckyballs.com/) y descubrí que realmente les gusta formar bipirámides pentagonales (http://en.wikipedia.org/wiki/Pipiagonal_bipirámide) con caras equiláteras. Por lo tanto, según la respuesta de perimosocordiae, los números "bipiramidales pentagonales" son 'scanl1 (+) (scanl1 (+) (1: map (* 5) [1 ..]))'. – jnylen