算法入门,看到递归,做了几个小练习。
1. 递归思路
1.1 找准基线条件(停止递归)
1.2 明确函数功能,知道写的函数究竟是干什么的
2. 求解最大(小)值
def get_max_value(lst):
if len(lst) == 2: #基线条件
return lst[0] if lst[0] >= lst[1] else lst[1]
return lst[0] if lst[0]>get_max_value(lst[1:]) else get_max_value(lst[1:])
if __name__ == "__main__":
li = [8, 4, 5, 7, 1, 3, 6, 2]
print("max value:", get_max_value(li))
max value: 8
Process finished with exit code 0
3. 列表求和
def sum_list(lst):
if len(lst) == 0:
return 0
return lst[0] + sum_list(lst[1:])
if __name__ == "__main__":
li = [8, 4, 5, 7, 1, 3, 6, 2]
print('The result of sum:')
print(sum_list(li))
The result of sum:
36
Process finished with exit code 0
4. 快速排序
def quick_sort(lst):
if len(lst) <= 1:
return lst
# base_value = lst[-1]#选取最后一个元素作为基准值
mid_index = int(len(lst)/2)
base_value = lst[mid_index]#选取中间值作为基准值
rest = lst[0:mid_index] + lst[mid_index+1:]
smaller = [i for i in rest if i < base_value]
larger = [j for j in rest if j >= base_value]
return quick_sort(smaller) + [base_value] + quick_sort(larger)
if __name__ == "__main__":
li = [8, 4, 5, 7, 1, 3, 6, 2]
print("排序后的队列:", quick_sort(li))
排序后的队列: [1, 2, 3, 4, 5, 6, 7, 8]
Process finished with exit code 0
5. 合并排序
def merge_sort(lst):
if len(lst) < 2:
return lst
#分的过程
mid_index = int(len(lst) / 2)
left = lst[:mid_index]
right = lst[mid_index:]
left = merge_sort(left)
right = merge_sort(right)
#治的过程
result = []
while left and right:
if left[0] <= right[0]:
result.append(left.pop(0))
else:
result.append(right.pop(0))
if left:
result += left
if right:
result += right
return result
if __name__ == "__main__":
li = [8, 4, 5, 7, 1, 3, 6, 2]
print("排序后的队列:", merge_sort(li))
排序后的队列: [1, 2, 3, 4, 5, 6, 7, 8]
Process finished with exit code 0
6. 二分查找
def er_fen(min_index, max_index, target):
mid_index = int((min_index+max_index)/2)
if a[mid_index] == target:
return mid_index
if a[mid_index]>target:
return er_fen(min_index, mid_index, target)
if a[mid_index]<target:
return er_fen(mid_index, max_index, target)
if __name__ == "__main__":
a = [1, 3, 6, 7, 9, 10, 100, 1000, 2000, 100000]
print(er_fen(0, len(a)-1, 1000))
7
Process finished with exit code 0
7. 有一长为1680,宽为640的土地,现要求将其分割成若干正方形,求解正方形的最大边长。
def max_length(a, b):
if a % b == 0:
return b
else:
return max_length(b, a-int(a/b)*b)
if __name__ == "__main__":
print('最大边长:')
print(max_length(1680, 640))
最大边长:
80
Process finished with exit code 0