递归
递归算法的三个特性:
- 求解规模为n的问题转化为一个或多个结构相同规模较小的的问题,然后从这些较小的问题可以构造出大问题的解
- 递归调用的次数必须是有限的
- 递归必定有结束条件来终止递归
# 递归
# 阶乘的例子
def factorial(n):
if n == 1: # 结束条件
return 1
else:
return n * factorial(n - 1)
print(factorial(3))
# 求幂次方
# 求幂次方
def power(x, n):
if n == 0:
return 1
else:
return x * power(x, n - 1)
power(3,2)
# 递归实现二分查找
def search(sequence, number, lower, upper):
if lower == upper: # 结束条件
assert number == sequence[upper]
return upper
else:
middle = (lower + upper) // 2
if number > sequence[middle]:
return search(sequence, number, middle + 1, upper)
else:
return search(sequence, number, lower, middle)
def search_2(sequence, number, lower, upper):
if lower == upper: # 结束条件
assert number == sequence[upper]
return upper
else:
middle = (lower + upper) // 2
if number < sequence[middle]:
return search(sequence, number, lower, middle-1)
else:
return search(sequence, number, middle+1, upper)
# 汉诺塔问题
"""
问题:将A杆上的所有盘子移动到C
n表示盘子个数,from_表示起始杆
buffe表示缓冲杆,to_表示目的杆
"""
def hannoi(n, from_, buffer, to_):
# 如果只有一个盘子,则直接从A挪到C
if n == 1:
print(from_, "-->", to_)
return
# 将编号为1~n-1的盘子从A全部挪到缓冲区B
hannoi(n-1, from_, to_, buffer)
# 将A杆上最后剩下的编号为n的盘子从A挪到C
hannoi(1, from_, buffer, to_)
# 将B杆上留下的n-1个盘子从缓冲区B挪到C
hannoi(n-1, buffer, from_, to_)
hannoi(3,"A", "B", "C")
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C
# 递归实现归并排序
def separator_elem(list_):
if len(list_) == 1:
return list_
mid = len(list_) // 2
left = separator_elem(list_[:mid])
right = separator_elem(list_[mid:])
return merge(left, right)
def merge(x, y):
l, r = 0, 0
tmp = []
while True:
if l >= len(x):
tmp += y[r:]
break
elif r >= len(y):
tmp += x[l:]
break
elif x[l] < y[r]:
tmp.append(x[l])
l += 1
else:
tmp.append(y[r])
r += 1
return tmp
print(separator_elem([2, 4, 2, 5, 1, 9, 0, 45, 4, 5, 99,3, 2]))
[0, 1, 2, 2, 2, 3, 4, 4, 5, 5, 9, 45, 99]