问题描述:寻找数组中的最大数字:
# 寻找数组中的最大值,这个写法真的可以啊
def find_max(arr):
# 先找基线条件
if len(arr) == 0:
return -1
if len(arr) == 1:
return arr[0]
# 缩小问题规模
else:
return max(arr[0],find_max(arr[1:]))
arr = [1,4,2,3,7,9,11]
res = find_max(arr)
print(res)
这个用分而治之真的可以哦!
记住两个基本要求:
- 基线条件
- 缩小问题规模
对于数组而言,一般基线条件就是为空数组和数组只有一个元素的情况。
然后重点关注如何缩小问题规模:思想是,拿出第一个元素,然后剩下的元素再去递归,这样问题就规模小了一点哦~~
只有自己能够运用这种思维方法来实现代码,才算真的理解了递归,并掌握了递归。
下面再思考一下快速排序算法:
首先把代码放这里:
def quicksort(array):
if len(array) < 2:
return array
else:
pivot = array[0] # 选择基准值
less = [i for i in array[1:] if i <= pivot] # 左边的子数组
greater = [i for i in array[1:] if i > pivot] # 右边的子数组
return quicksort(less) + [pivot] + quicksort(greater)
print(quicksort([10,5,2,3]))
思考:
仍然是从递归的基础思想出发:
- 设置基线条件
- 缩小问题规模
快排的思路是选出pivot,然后把数组一分为二,再分别对子数组进行快速排序。
等到数组只剩下一个或者为空时,就到达基线条件。栈开始回退。
从归纳证明的角度来看,分成两步走:
- 基线条件
- 归纳条件
基线条件下,这种算法对于空数组或者包含一个数组有用。
归纳条件下,如果能够证明快排对包含一个元素的数组管用,对包含两个元素的数组也将管用;
对包含两个元素的数组管用,对包含三个元素的数组也将管用;以此类推。
归纳证明和D&C协同发生作用。
END.