递归生成帕斯卡三角的简单函数中出现奇怪缩进错误求助
递归生成帕斯卡三角的类:问题解析与修正
嘿,我看你正在写一个用递归生成帕斯卡三角前n行的类,这里面有几个小问题需要修正,我帮你梳理下,同时给出可以正常运行的版本:
首先先贴出你的原始代码(看起来你写到循环部分就中断了):
class PascalTriangle: """Returns the first n lines of the Pascal Triangle. Recursive.""" def __init__ (self, n): assert(n > 0) self.lst[0][0] = 1 self.lines = n calculate (1) def __call__(self, n): assert(n > 0) self.lst[0][0] = 1 self.lines = n calculate (1) def calculate (self, k): if k == self.lines: return self.lst else: row = [ ] row.append(1) # <------- line 45 for i in range(1, k-1...
代码里的几个问题:
- 实例变量未初始化:你直接给
self.lst[0][0]赋值,但self.lst根本没被创建,运行时会直接抛出AttributeError,得先把它初始化为包含第一行的列表。 - 方法调用缺少实例绑定:调用
calculate(1)的时候没加self.,Python会把它当成全局函数,找不到就报错,必须用self.calculate(1)来调用实例方法。 - 循环逻辑不完整:你的循环写到
range(1, k-1...就断了,实际上帕斯卡三角第k行(从0开始计数)的中间元素,是上一行第i-1和第i个元素的和,循环范围应该是range(1, k),最后还要在末尾加个1。 - 递归终止条件的小问题:如果要生成n行,我们从第1行(索引1)开始递归,直到k等于n时停止,这样刚好生成n行(索引0到n-1)。
修正后的完整代码:
class PascalTriangle: """Returns the first n lines of the Pascal Triangle. Recursive.""" def __init__(self, n): assert(n > 0), "n must be a positive integer" self.lines = n self.lst = [[1]] # 初始化第一行 if n > 1: self.calculate(1) # 从第1行开始生成(索引从0算) def __call__(self, n): assert(n > 0), "n must be a positive integer" self.lines = n self.lst = [[1]] if n > 1: self.calculate(1) return self.lst def calculate(self, k): if k == self.lines: return self.lst # 生成当前行:开头先加1 row = [1] # 计算中间元素:上一行相邻两个元素之和 for i in range(1, k): row.append(self.lst[k-1][i-1] + self.lst[k-1][i]) # 末尾加1 row.append(1) self.lst.append(row) # 递归生成下一行 return self.calculate(k + 1)
测试示例:
你可以这样用这个类:
# 初始化时生成5行 pt = PascalTriangle(5) print(pt.lst) # 输出:[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]] # 用__call__方法重新生成3行 print(pt(3)) # 输出:[[1], [1, 1], [1, 2, 1]]
内容的提问来源于stack exchange,提问作者Ziezi
相关产品推荐
相关产品推荐

