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
。