You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归生成帕斯卡三角的简单函数中出现奇怪缩进错误求助

递归生成帕斯卡三角的类:问题解析与修正

嘿,我看你正在写一个用递归生成帕斯卡三角前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:30:45