斐波那契数列的定义为:其第n个数是其第n-2个数与其第n-1个数的和。一般的斐波那契数列以0为第0个数,1为第1个数,则数列可表示为:0, 1, 1, 2, 3, 5, 8, 13......
杨辉三角则如下图所示:
可以发现其第n行有n个数字,且第一个和最后一个为1,其余的n-2个数字是上一行(n-1行)相邻数字之和。
总结发现,这两个代数集合都有如下的特性:
第一,元素个数为无穷,那么在python中就不能存储为list。
第二,有循环特性,但与递归不同。
对于此类问题,在python中,可以用generator(生成器)来解决。
斐波那契数列代码如下:
deffib():
a,b =,1
while True:
yielda
a,b = b,a + b
可以看到这个函数与普通函数的唯一区别就是:
yielda
并且这里面的:
while True:
似乎会导致无限的循环?
事实上generator是类惰性计算,它会执行至'yield'命令停下,然后再次调用时从上一次的'yield'开始所以我们可以这样调用fib函数
n =
fortinfib():
print(t)
n = n +1
ifn ==4:
break
并输出:
1
1
2
杨辉三角代码如下:
deftriangles():
L = [1]
while True:
yieldL
L.append()
L = [L[x-1] + L[x]forxinrange(len(L))]
这里面:
L.append()
指在L后增加一个元素0,而:
L = [L[x-1] + L[x]forxinrange(len(L))]
是一个列表生成式,里面包含了一个for in迭代。其中len(L)输出L的元素数目,range()输出一列自然数,但range(n)中不包含n。L[x-1] + L[x]即生成新列表的元素通项。类似斐波那契数列函数的调用输出:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
(前10行杨辉三角
)
领取专属 10元无门槛券
私享最新 技术干货