Pregunta

Actualmente estoy trabajando en una tarea de generar lo que se conoce como de Pascal triángulo en Python .

Hasta el momento, esto es lo que tengo:

def mytri(myrange):
    trianglevar = [[1]]
    for i in range(1, myrange):
        tempvar = [1]
        for n in range(0, i-1):
            tempvar.append(trianglevar[i-1][n]+trianglevar[i-1][n+1])
        tempvar.append(1)
        trianglevar.append(tempvar)
    return trianglevar

def mymenu():
    for i in mytri(int(raw_input("Please enter the height of the triangle: "))):
        print i
    print '\n'
    choicevar = raw_input("Would you like to create another triangle? (y/n): ")
    if choicevar == "y":
        mymenu()
    else:
        print "Goodbye."

mymenu()

Lo que hace el programa hasta este punto es realizar el cálculo para el triángulo. Se calcula los números en cada fila (comenzando con 1), y se detiene después de alcanzar el número de filas especificadas por el usuario.

Sin embargo, no estoy seguro de cómo dar formato a mi triángulo. Se imprime en la actualidad como:

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
...etc.

La salida que quiero es:

        [1]
      [1, 1]
    [1, 2, 1]
  [1, 3, 3, 1]
[1, 4, 6, 4, 1]
...etc.

(Es un poco fuera debido a las abrazaderas / comas, pero estoy tratando de conseguir el formato general ahora mismo.)

Gracias por la ayuda que puede ofrecer!

¿Fue útil?

Solución

h = int(raw_input("Please enter the height of the triangle: "))
for i in mytri(h):
    print " " * (h * 2), i
    h -= 1

Así que aquí se imprime 2 espacios para cada nivel de la pirámide. Primera línea se sangra en el doble del número de la altura de los espacios. A medida que Descenso de una sola planta, disminuye la sangría por 2.

Otros consejos

Aquí hay un par de consejos. Proveedores:

' ' * someNumber

para la separación. Si no desea que los soportes de la lista, puede recorrer más de la fila:

for el in i:
  # Write el as you want

o utilizar join .

También puede encontrar enumerate útil para obtener índices (por ejemplo, para espaciar) .

Una vez que tenga sus filas, que probablemente tendría la última fila como el más largo.

Desde que acaba de imprimir a cabo, a continuación, puede tomar la l = len(str(rows[-1])) y luego, combinarlo con un str(rows[i]).center(l) para cada fila.

EDIT: ¿No era consciente de que debemos dar todas las respuestas a las tareas ... Si es así:

def mytri(myrange):
    rows = list()
    lr = None # Last row

    for i in xrange(myrange+1):
        try:
            lr = [1] + [lr[i] + lr[i+1] for i in range(len(lr) - 1)] + [1]
        except TypeError:
            lr = [1]
        #rows.append(str(lr))
        rows.append(' '.join(str(v) for v in lr))
    return rows

rows = mytri(10)
l = len(rows[-1])
print '\n'.join(v.center(l) for v in rows)

salida sería

                 1                 
                1 1                
               1 2 1               
              1 3 3 1              
             1 4 6 4 1             
           1 5 10 10 5 1           
          1 6 15 20 15 6 1         
        1 7 21 35 35 21 7 1        
       1 8 28 56 70 56 28 8 1      
    1 9 36 84 126 126 84 36 9 1    
1 10 45 120 210 252 210 120 45 10 1

En lugar de regenerar las filas anteriores en cada iteración, se puede producir cada fila como es que generamos:

def mytri(height):
  start = [1]
  for _ in xrange(height):  # "_" for an unused variable
    yield start  # loop written "backwards" for simplicity,
    # though this does generate one unused row
    next_row = [1]
    for a, b in zip(start, start[1:]):  # slicing creates a new list, not a
      next_row.append(a + b)            # concern for this problem, but in
    next_row.append(1)                  # others you could use itertools.islice
    start = next_row                    # to avoid that

Ahora enumerar las hacia atrás de altura a lo largo de cada fila:

height = int(raw_input("Height: "))
for n, row in zip(xrange(height - 1, -1, -1), mytri(height)):
  print "   " * n, " ".join("%5d" % x for x in row)

Esto rápidamente se alinea con muchas filas, pero debe conseguir que va en la dirección correcta.

Es necesario para rellenar todos los números por lo que son de la misma anchura
También es necesario añadir un poco de relleno en el lado izquierdo

def mymenu():
    res = mytri(int(raw_input("Please enter the height of the triangle: ")))
    width = len(str(res[-1][len(res[-1])/2]))
    for i, row in enumerate(res):
        print " "*(width*(len(res)-i)/2)+" ".join(str(x).rjust(width) for x in row)
    print '\n'
    choicevar = raw_input("Would you like to create another triangle? (y/n): ")
    if choicevar == "y":
        mymenu()
    else:
        print "Goodbye."

salida:

Please enter the height of the triangle: 10
                1 
              1   1 
             1   2   1 
           1   3   3   1 
          1   4   6   4   1 
        1   5   10  10  5   1 
       1   6   15  20  15  6   1 
     1   7   21  35  35  21  7   1 
    1   8   28  56  70  56  28  8   1 
  1   9   36  84 126 126  84  36  9   1 
n=input('enter n:')
z=0
d=' '
while z<n:
        d=d+'   '
        z=z+1
print d,1
l1=[1]
l2=[1,1]
def space(n,a):
        s=''
        while a<n:
        s=s+' '
        a=a+1
        return s
def digit(n):
        r=1
        k=0
        while r!=0:
            r=n/10**k
            k=k+1
        return k-1
def print_l(l1,b):
        d=''
        d='\n'+space(b-1,0)*3
        i=0
        while i<len(l1):
            d=d+' '*(6-digit(l1[i]))+str(l1[i])
            i=i+1
        print d
b=n-1
k=1
while k<n:
        l2=l1
        l1=[1]
        i=1
        while len(l1)<len(l2):
            if i>len(l2)/2:
                l1.append(l1[len(l2)-i])
            else:
                l1.append(l2[i-1]+l2[i])
            i=i+1   
        k=k+1
        l1.append(1)
        print_l(l1,b)
        b=b-1
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top