python递归pascal三角形

2024-09-28 05:16:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

[[1], [1, 1], [1, 2, 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

很明显,我已经完成了分配的任务,这只是为了更深入地理解递归。。。

迭代解:

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

Tags: 函数in列表newforreturnrange数字
3条回答

是的,正如Karl Knechtel也指出的,递归Pascal三角形可以这样:

P=lambda h:(lambda x:x+[[x+y for x,y in zip(x[-1]+[0],[0]+x[-1])]])(P(h-1))if h>1 else[[1]]
print(P(10))

happydave解决方案的另一种选择,使用尾部递归:

def triangle(n, lol=None):
    if lol is None: lol = [[1]]
    if n == 1:
        return lol
    else:
        prev_row = lol[-1]
        new_row = [1] + [sum(i) for i in zip(prev_row, prev_row[1:])] + [1]
        return triangle(n - 1, lol + [new_row])

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

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

相关问题 更多 >

    热门问题