数据结构相关问题
1、生成斐波那契数列—yield的应用
考察点: yield
1、yield的特点:
(1)、带有 yield 的函数是生成器:带有 yield 的函数在 Python 中被称之为 generator生成器,当使用一个yield的时候,对应的函数就是一个生成器了。成器对象可以被for循环迭代,也可以手动执行next或者send方法精准控制这个生成器的内部执行,
(2)、yield是一个类似 return 的关键字:迭代一次遇到yield时,就返回yield后面(右边)的值。yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始。
2、yield的两大函数:
next:next方法就相当于“下一步”生成哪个数,这一次的next开始的地方是接着上一次的next停止的地方执行的。next方法第一次调用a.next()无法输出参数,以后每次a.next(赋值)都等于函数体里面yield表达式的值。
send:send方法会首先把上一次挂起的yield语句的返回值通过参数设定,从而实现与生成器方法的交互。
注意:
(1)、当send方法的参数为None时,它与next方法完全等价。但是注意,虽然这样的代码可以接受,但是不规范。所以,在调用send方法之前,还是先调用一次next方法为好。
(2)、其实next和send在一定意义上作用是相似的,区别是send可以传递yield表达式的值进去,而next不能传递特定的值,只能传递None进去。因此,我们可以看做c.next 和 c.send(None) 作用是一样的。
3、yield的应用:需要节约内存不需要一把全部返回,每次使用的时候再去算,我们就会用到生成器。
在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行。而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。
def fab(max):
n, a, b = 0, 0, 1
while n < max:
yield b # 使用 yield
a, b = b, a + b
n = n + 1
for n in fab(5):
print(n)
2、八皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。
考察点:考察结构性编程的能力
理解:在8行8列的棋盘上摆放8个皇后,使之不能互相攻击——任意两个不在同一行、同一列或同一斜线上。典型的回溯算法。
首先,我们要想到某种方法来解决冲突检测问题,即不能令棋子处于能相互吃掉的位置——相邻、左右、对角线。
其次,运用回溯的方法,求得问题的解。此处具体为函数的递归调用,当调用到棋盘的最后一行,便跳出,求得解。|
最后,将解打印出来。难点在于对递归调用函数的理解。
1、python八行代码简单实现的八皇后问题
def queen(lists, current=0): #current当前状态
if current == len(lists):
print(lists)
return 0
for col in range(len(lists)): #外for循环
lists[current], flag = col, True #列表内赋值,初始化标记
for row in range(current): #内for循环取出每一行,if判断,同列或者对角线,标记为false,且跳出当前层的for循环
if lists[row] == col or abs(col - lists[row]) == current - row:
flag = False
break
if flag: #if判断,合法位置才进行递归调用
queen(lists, current+1)
res=queen([None]*8)
2、利用yield函数实现的八皇后问题
Algorithm:【Algorithm算法进阶之路】之利用yield函数解决八皇后问题
3、两种LCS问题——最长公共子序列和最长公共字符串
Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离