python递归pascal三角形

Ver*_*int 3 python recursion pascals-triangle

完成使用迭代函数创建pascal三角形的赋值后,我尝试使用递归函数重新创建它.我已经达到了这样的程度,我可以通过它来生成与作为参数传入的数字相对应的单独行.但有几次尝试让它产生整个三角形直到并包括那一行都失败了.我甚至尝试编写一个单独的函数,它迭代输入数字的范围,并使用迭代数字调用递归函数,同时在返回该列表之前将各行附加到列表.所需的输出应该是列表,其中每个内部列表包含三角形的一行.像这样:

[[1], [1, 1], [1, 2, 1]...]
Run Code Online (Sandbox Code Playgroud)

相反,它返回一个完全填充1的嵌套列表的乱七八糟的混乱.

这是有问题的递归函数,没有附加行的第二个函数(我真的想要1个全包函数):

def triangle(n):
    if n == 0:
        return []
    elif n == 1:
        return [1]
    else:
        new_row = [1]
        last_row = triangle(n-1)
        for i in range(len(last_row)-1):
            new_row.append(last_row[i] + last_row[i+1])
        new_row += [1]
    return new_row
Run Code Online (Sandbox Code Playgroud)

要清楚,我已经完成了分配的任务,这只是为了更深入地理解递归...

迭代解决方案:

def triangle(n):
    result = []
    for row in range(n):
        newrow = [1]
        for col in range(1, row+1):
            newcell = newrow[col-1] * float(row+1-col)/col
            newrow.append(int(newcell))
        result.append(newrow)
    return result
Run Code Online (Sandbox Code Playgroud)

hap*_*ave 12

您只需要通过递归传递列表列表,然后选择列表的最后一个元素(即三角形的最后一行)来构建新行.像这样:

def triangle(n):
    if n == 0:
        return []
    elif n == 1:
        return [[1]]
    else:
        new_row = [1]
        result = triangle(n-1)
        last_row = result[-1]
        for i in range(len(last_row)-1):
            new_row.append(last_row[i] + last_row[i+1])
        new_row += [1]
        result.append(new_row)
    return result
Run Code Online (Sandbox Code Playgroud)