python基础(20)递归
递归函数就是自己调用自己
也因此编写这样的函数时很容易出错,进而导致无限循环。
编写递归函数时,必须告诉它何时停止递归
。正因为如此,每个递归函数都有两部分:基线条件(base case)
和递归条件(recursive case)
。
递归条件指的是函数调用自己
,而基线条件则指的是函数什么条件下不再调用自己,从而避免形成无限循环
。
>>> def func(x):
x += 1
print(x)
func(x)
>>> func(0)
# 这是一个没有终止条件的递归,x代表调用的次数,理论上最大1000层
>>> import sys
>>> sys.setrecursionlimit(100)
# 改变递归调用层数
来写一个斐波那契数列
斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368
从第三个数开始,每一个数都是前面两个数的和
>>> def fib(nums):
if nums <=2:
return 1
return fib(nums-1) + fib(nums-2)
>>> fib(5)
5
>>> fib(8)
21
>>> fib(34)
5702887
>>> [fib(i) for i in range(1,5)]
[1, 1, 2, 3]
>>> [fib(i) for i in range(1,8)]
[1, 1, 2, 3, 5, 8, 13]
经典快速排序
>>> def quicksocrt(array):
if len(array) < 2:
return array # 基线条件
pivot = array[0] # 选择基准值
less = [i for i in array[1:] if i <= pivot] # 由小于基准值所有元素组成的小数组
greater = [i for i in array[1:] if i > pivot] # 由大于基准值所有元素组成的小数组
return quicksocrt(less) + [pivot] + quicksocrt(greater)
>>> quicksocrt([2,3,23,1,8,4,9,33,5,22,7])
[1, 2, 3, 4, 5, 7, 8, 9, 22, 23, 33]