# coding=utf-8
"""
question:
可以用 2*1 的小矩形横着或者竖着去覆盖更大的矩形。
请问用 n 个 2*1 的小矩形无重叠地覆盖一个 2*n 的大矩形,总共有多少种覆盖方法?
用递归和非递归方式实现
"""
# 递归实现
def rect_cover_recur(n):
if n <= 0:
return 0
elif n == 1:
return 1
elif n == 2:
return 2
else:
return rect_cover_recur(n - 1) + rect_cover_recur(n - 2)
# 非递归实现1
def rect_cover_no_recur1(n):
if n <= 0:
return 0
elif n == 1:
return 1
elif n == 2:
return 2
else:
a = 1
b = 2
i = 2
while i < n:
a, b = b, a + b
i += 1
return b
# 非递归实现2,空间复杂度大于非递归实现1
def rect_cover_no_recur2(n):
if n <= 0:
return 0
elif n == 1:
return 1
elif n == 2:
return 2
else:
l = [0, 1, 2]
while len(l) <= n:
l.append(l[-1] + l[-2])
return l[-1]
if __name__ == '__main__':
print(rect_cover_recur(20))
print(rect_cover_no_recur1(20))
print(rect_cover_no_recur2(20))