什么是递归
维基百科: 在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。
举个例子:
排队买奶茶,想知道自己排在第几个,不想走到前面去数。于是问排在前面的桂香,她排在第几个。桂香也不想去数,于是他也问前面的淑芬同样的问题。直到问道队首的人。队首的翠兰人会说我排在第一个,然后消息会一个人一个人再传回到你这里,这样就直到排在第几个了。
问题可以等价为表达式:
为了防止无限套娃,队列中最终要有一个人知道自己是排在第几个。递归函数中需要有个条件判断,然后返回固定的值。
递归函数2个要素:
- 找出函数等价关系式
- 找出递归基(结束条件)
举例1:求数据n的阶乘
① 等价关系式: f(n) = n * f(n-1)
② 递归基: f(1) = 1
函数为:
def factorial(n):
if n == 1: # 递归基
return 1
else:
return n * factorial(n-1)
举例2:经典的问题 Fibonacci数列
① 数列等价关系式 f(n) = f(n-1)+ f(n-2)
② 找出递归基, f(2) = f(1) + f(0) , 所以 f(1) 和 f(0)不能再调用函数,f(1)=1 f(0)=1
所以函数为:
def fibonacci(n):
if n in (0, 1): # 递归基
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
举例3:快速排序
快速排序的本质, 从需要排序的数里面随便找出一个,然后,把比这个数小的放在这个数左边,比这个数大的放在这个数右边。
原始数组:
第一次处理后,将小于6的都放到坐边,大于6的都放到右边
然后递归对坐边和右边的子数组进行分组,直到切割成最小单元为1个元素。则整个数据的完成排序。
因为只是进行换位处理,不反回数据,所以。
① 数列等价关系式 f(array,left, right) = 移动第一个元素到位置r, quick(array, left, r-1), quick(array, r+1, rght)
② 找出递归基, 子数组长度==1或者0,则不处理
所以函数为:
def quick_sort(array, left, right):
# 递归基
if left>=right:
return None
key=array[left]
l,r =left,right
while l<r:
while l < r and array[r] > key:
r -= 1
array[l]=array[r]
while l < r and array[l] <= key:
l +=1
array[r]=array[l]
array[r]=key
quick_sort(array, left, r-1)
quick_sort(array, r+1, right)