No estoy seguro de qué estoy haciendo mal con mi código aquí al hacer que un triángulo pascal recursivo funcione en python. Cualquier ayuda es amablemente apreciada :)

n = 5
def printPascal(n):
    Pascal_List = []
    if n == 0:
        Pascal_List.append([1])
        return Pascal_List
    if n == 1:
        Pascal_List.append([1])
        Pascal_List.append([1,1])
        return Pascal_List


    else:

        new_row = [1]
        final_r = printPascal(n - 1)
        last_row = final_r[-1]
        for k in range(1, last_row[-1]):
            new_row.append(final_r[k] + final_r[k - 1])

        new_row += last_row
        final_r.append(new_row)
        return final_r

print(printPascal(n))
0
Harvey Connor 13 may. 2016 a las 12:27

3 respuestas

La mejor respuesta

Has hecho algunas confusiones en el bucle que construye una nueva línea. range(1, last_row[-1]) realmente no tiene sentido; desea iterar sobre los índices de la última fila, es decir, range(len(last_row)). También has mezclado final_r y last_row en la siguiente línea.

Aquí hay una versión corregida de su código:

n = 5

def printPascal(n):
    Pascal_List = []
    if n == 0:
        Pascal_List.append([1])
        return Pascal_List

    if n == 1:
        Pascal_List.append([1])
        Pascal_List.append([1,1])
        return Pascal_List

    else:
        new_row = [1]
        final_r = printPascal(n - 1)
        last_row = final_r[-1]
        for k in range(len(last_row)-1):
            new_row.append(last_row[k] + last_row[k + 1])
        new_row.append(1)

        final_r.append(new_row)
        return final_r

print(printPascal(n))
2
zale 13 may. 2016 a las 10:24

Hay un mejor método para hacer esto usando la fórmula general para el triángulo de Pascal (n elige k), pero no voy a entrar en eso.

Mirando su código, supongo que está tratando de agregar los dos números anteriores de la fila anterior para obtener el siguiente número.

Cambie reemplazar con esto en su condición else:

#It should be length instead.
for k in range(1, len(last_row)):
   new_row.append(last_row[k] + last_row[k - 1])
#You need to add the 1 at the end
new_row.append(1)
1
Moon Cheesez 13 may. 2016 a las 10:30

@zale ya explicó el problema con su bucle for, no es necesario repetir eso. Sin embargo, tenga en cuenta que puede hacer que su código sea mucho más simple:

  • no es necesario el tratamiento especial del caso n == 1
  • puedes hacer la segunda parte mucho más simple rellenando la última línea con ceros

Prueba esto:

def printPascal(n):
    if n == 0:
        return [[1]]
    else:
        final_r = printPascal(n - 1)
        last = [0] + final_r[-1] + [0] # note: this does not modify final_r
        new_row = [last[k] + last[k - 1] for k in range(1, len(last))]
        return final_r + [new_row]
1
Community 23 may. 2017 a las 12:16