用python代码实现杨辉三角的方式有很多,在这里我将为大家呈现出两种方法。
我们首先来看题目:
我们知道杨辉三角的每个数等于它上方两数之和。利用这个思想,我们可以利用递归去创建一个函数即可。下面奉上我的实验代码
n=int(input("请问要输出多少行杨辉三角:"))
def y(r,c):
if r==c or c==0:
return 1
else:
return y(r-1,c-1)+y(r-1,c)
for i in range(0,n):
print(" " * (n - i), end=" ")
for k in range(0,i+1):
print(y(i,k),end=" ")
if(i==k):
print(" ")
这个函数的基本逻辑就是控制每一行的第一个数和最后一个数为1,然后不断地去实现递归,让这个函数一直去返回,最后得到每一行的数是上一行两个相邻数的相加。这个函数很巧妙的运用了元组进行传递数据。当我们打印四行杨辉三角是,代码结果如下:
屏幕上很清晰的为我们展示了四行杨辉三角,这就是第一种方法。
第二种方法就是用到生成器的构造。
下面我来为大家介绍一下生成器的构造。
1.一个带有yield的函数就是一个生成器generator
2.和普通代码相比,生成一个generator看起来像函数调用,但不会执行任何函数代码,知到对其调用next(),在for循环中会自动调用next()(在for循中会自动调用next())才开始执行。
3.虽然执行流程仍按函数的流程执行,但每执行到一个yield就会中断,并返回一个迭代值,下次执行时从yield的下一句就开始执行。看起来就好像一个函数在正常执行的过程中被中断了数次,每次中断都会通过yield返回当前的迭代值。下面呈现用生成器写的杨辉三角:
n=int(input("请输入要生成几行杨辉三角形"))
def a(n):
list = [1]
for i in range(0,n):
yield list
list=[list[i]+list[i+1] for i in range(len(list)-1)]
list.insert(0,1)
list.append(1)
for i in a(n):
print(i)
当函数第一次执行碰到yield时,会中断,返回一个迭代值,此时返回的应该是list=【1】,然后会在for 循环里打印。接着执行yield后面的语句,直到再次执行到list=【1,1】此时又会返回一个迭代值,在for循环里打印。
yield的作用就是把函数变成一个generator,带有yield的函数不再是一个普通函数,python解释器会将其视为一个generator。调用a(5)不会执行a函数,而是返回一个 iterable对象,在for循环执行时,每次循环都会执行a函数内部的代码,执行到yield list时,a函数就会返回一个迭代值,下次迭代时,代码从yield下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到yield。
当然,我们也可以手动调用a(5)中的next()方法。
下面呈现打印四行的生成器杨辉三角:
每次都会在yield中断,然后打印返回的迭代值。