1. 递归
“如果使用循环,程序的性能可能更高;如果使用递归,程序可能更容易理解”——Stack Overflow
编写递归函数时,必须告诉它何时停止递归。
- 基线条件,达到这个条件时,函数不再调用自己,从而避免无线循环(通常是个if语句)
- 递归条件,递归函数调用自己
注意:递归使用到了栈结构,所以递归所占的内存开销很大
2. 分治(Divide & Conquer)
2.1 分治的思想
它采用了分而治之的思想,使用了递归的方法去实现分而治之。换句话说你可以将分治理解为递归的一个应用。
使用D&C解决问题的过程包括两个步骤:
① 找出基线条件,这种条件必须尽可能简单(例如涉及数组的递归问题时,基线条件一般是数组为空或只包含一个元素)
② 不断缩小问题规模(使用递归),直到符合基线条件
2.2 分治——快速排序
def quick_sort(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 quick_sort(less) + [pivot] + quick_sort(greater) # 递归条件,因为缩小了问题规模