我尝试做一个递归函数,直到第n行生成一个pascal的三角形,n是用户输入。到目前为止,这是我的代码:
def printPascal(l,n):
while n != 1:
temp = [None]*(len(l)+1)
temp[0] = 1
temp[len(l)] = 1
for i in range(1,len(temp)-1):
temp[i] = l[i] + l[i-1]
l = temp
print(temp)
n = n-1
printPascal(l,n)
n = int(input("Enter a value for n:"))
l = [1,1]
printPascal(l,n)
这就是它给我的错误:
Traceback (most recent call last):
File "C:\Users\User\Desktop\test.py", line 16, in <module>
printPascal(l,n)
File "C:\Users\User\Desktop\test.py", line 11, in printPascal
printPascal(l,n)
File "C:\Users\User\Desktop\test.py", line 7, in printPascal
temp[i] = l[i] + l[i-1]
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
事情是我有点理解这个问题,并试图追踪它无济于事。我知道在temp[i] = l[i] + l[i-1]
代码中以l[i]
或l[i -1]
为"None"
并且我不知道原因。
感谢您在我这个小困境中的时间和帮助。
答案 0 :(得分:1)
您的代码中有一点缩进错误。
def printPascal(l,n):
while n != 1:
temp = [0]*(len(l)+1)
temp[0] = 1
temp[len(l)] = 1
for i in range(1,len(temp)-1):
temp[i] = l[i] + l[i-1]
l = temp
print(temp)
n = n-1
printPascal(l,n)
答案 1 :(得分:1)
你在“for”循环中有太多的代码。在填写l
中的所有值之前,您将temp
的值替换为temp
的值。
for
循环应该只包含第一个语句。
答案 2 :(得分:1)
我会向您展示一种优化的方法,而不是修复您的代码:
def pascal_triangle(n, triangle=[[1]]):
if n > len(triangle):
last_row = triangle[-1]
next_row = [a+b for (a, b) in zip([0] + last_row, last_row + [0])]
return pascal_triangle(n, triangle + [next_row])
return triangle
如何运行它:
n = int(input("Pascal's triangle size: "))
print(*pascal_triangle(n), sep="\n")
输入9
的输出示例:
[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]
或使用更漂亮的打印命令:
print(*[" ".join(map(str, line)).center(40) for line in pascal_triangle(9)], sep="\n")
看起来像这样:
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
答案 3 :(得分:0)
出现此错误是因为您没有计算并且没有将足够的信息返回给函数。
尝试调试或遵循您的代码。
您将轻松解决该问题:)