利用递归编写杨辉三角以及利用生成器编写杨辉三角

用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中断,然后打印返回的迭代值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值