《programming for the puzzled》第11章
涉及到的算法和语言问题:理解列表,递归进行分治搜索。
有2^n×2^n大小的院子,要用面积为3的L形的瓷砖铺满
![5d71afe9b2abe46896b78a4077ef8f1c.png](https://img-blog.csdnimg.cn/img_convert/5d71afe9b2abe46896b78a4077ef8f1c.png)
可以在不突破边界,不破坏瓷砖,瓷砖之间也不重叠的情况下完成吗?答案是不行,因为2^n×2^n不能被3整除,只能被2整除。而如果允许有一个方块的地方可以被剩下来,则2^2n-1则可以被3整除。
有没有一个铺砖的算法能够将任意2^n×2^n大小的院子用面积为3的L形的砖铺满只剩一个方块没铺?
归并排序是分治算法的一个例子。
要排序一个序列(如[a, b, c, d]),可以把这个序列分成两个序列([a,b], [c,d]),然后递归地对两个序列进行排序。如果序列长度为2,则比较这两个元素,结束递归。最后用一个合并的函数将两个列表合并到一起。
# coding:utf-8
# 《programming for the puzzled》实操
# 11.瓷砖铺地
# 分治法,归并排序
def mergeSort(L):
# 不加下面这行递归无法结束
if len(L) < 2:
return L
if len(L) == 2:
if L[0] <= L[1]: