python实现杨辉三角

1,杨辉三角递归

程序:

def a(row, col):

    if col == 0 or col == row:

        return 1

    else:

        return a(row - 1, col - 1) + a(row - 1, col)

def b(rows):

    for i in range(rows):

        for j in range(i + 1):

            print(a(i, j), end=" ")

        print()

n = 5

b(n)

截图:

心得:

函数 a(row, col)

这是一个递归函数,用于计算二维数组中从左上角到右下角的路径数,其中只能向下或向右移动。

当 col 等于 0 或者 row 时,表示已经到达了底部或右边界,此时没有其他路径可以走,因此返回 1

否则,函数返回到达当前位置的两种可能路径数:从左边的格子 a(row - 1, col - 1) 或者从上面的格子 a(row - 1, col)

函数 b(rows)

这个函数接收一个参数 rows,表示需要打印的行数。使用两个嵌套的 for 循环来打印每一行的路径数。外层循环控制行数,内层循环控制每行打印的列数。在内层循环中,使用 a(i, j) 来获取当前位置的路径数,并使用 print(a(i, j), end=" ") 来打印,end=" " 表示打印后不换行,而是继续在同一行打印。

2,生成器生成杨辉三角

代码:def a(n):

    row = [1]

    for _ in range(n):

        yield row

        row = [x + y for x, y in zip([0]+row, row+[0])]

n = 6

triangle = a(n)

for row in triangle:

    print(' '.join(map(str, row)).center(n*2))

运行:

心得:

函数 a(n)

这个函数使用了一个列表 row 来存储当前行的数字,初始值为 [1]

使用 yield 关键字,它使得 a 成为一个生成器函数,可以在执行过程中产生值,并且可以在每次 yield 后暂停和恢复。

在每次迭代中,首先 yield 当前行,然后计算下一行。这是通过列表推导式完成的,它使用 zip([0]+row, row+[0]) 来对应地将当前行的元素与前一行或后一行的元素配对,然后计算每对元素的和

3,第一次编写的杨辉三角存在的问题

def aaa(n):

    a = [1]

    if n == 1:

        print(a)

    else:

        i = 0

        while i < n:

            b = []

            for j in range(i + 1):

                if j == 0 or j == i:

                    b.append(1)

                else:

                    c = a[j-1] + a[j]

                    b.append(c)

            a = b

            print(a)

            i += 1

aaa(7)

存在问题:

重复计算

每次循环迭代时,函数都会重新计算每行的值,即使这些值在之前的迭代中已经计算过。这导致了很多不必要的重复计算。

空间效率

函数在每次迭代时创建了一个新的列表 b,这在一定程度上是必要的,但如果能够优化存储方式,可能会减少空间的使用。

代码冗余

在 for 循环中,对于 j == 0 或 j == i 的情况,总是添加 1。这部分代码可以简化,因为这是帕斯卡三角形的已知性质,即每行的首尾元素总是 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值