递归函数的两个条件:
1.基线条件:函数不 再调用自己;
2.递归条件:函数调用自己;
分而治之(divide and conquer,D&C)是一种通用的问题解决方法;
D&C是递归的。使用D&C解决问题的过程的两个步骤:
1.找出基线条件,这种条件必须尽可能简单;
2.不断将问题分解(或者说缩小规模),直到符合基线条件;
涉及数组(列表)的递归函数 时,基线条件通常是数组 为 空,或者只包含一个元素;注意检查基线 条件。
使用递归求和:
def my_sum(arr):
if arr == []:
return 0
else:
return arr[0] + sum(arr[1:])
if __name__ == '__main__':
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(my_sum(arr))
二分查找的基线条件是数组中只包含一个元素,如果要查找的值与这个元素相同,就找到,否则,就 说明他不在数组中;
二分查找的递归条件中,把数组分成两半,将其中一半丢掉,并对另一半执行二分查找;
快速排序也使用了D&C的思想:
快速排序的思想:
1.从数组中选择一个元素,也就是基准值;
2.将数组分成两个子数组,小于基准值的元素组成的子数组和大于基准值的元素组成的子数组;(找出比基准值小的元素以及比基准值大的元素;--也称为分区)
3.对这两个子数组进行快速排序(得到了两个无序的子数组,如果这两个子数组是有序的,只需要将两个子数组与基准值合并即可;
如果两个子数组是无序的,只需要对这两个子数组进行快速排序,再合并结果即可;)
def quicksort(arr):
if len(arr) < 2:
return arr
else:
base = arr[0]
lesser = [i for i in arr[1:] if i <= base]
greater = [i for i in arr[1:] if i > base]
return quicksort(lesser) + [base] + quicksort(greater)
if __name__ == '__main__':
li = [9, 1, 16, 55, 33, 10, 100]
print(quicksort(li))