最近学习排序算法的时候 快速排序和归并排序中都用到了递归函数,干脆也写一个自己对递归函数的理解。供大家借鉴。
递归函数
递归函数用最简单的一句话说应该就是:在A函数内部调用A函数了。
随便写个代码 举个栗子
def recursive_test(n):
print('数字:',n)
recursive_test(n-1)
recursive_test(5)
上面这个就是一个不完整的递归函数 recursive_test在函数内部 不断的调用自己
下面是输出的结果
一直输出直到运行次数过多而报错。因为recursive_test一直不断的调用自己 输出数字。无限的输出而没有停止。
所以在递归函数中我们必须设置一个条件让他停止递归。
把代码稍微修改下。
def recursive_test(n):
print('数字:',n)
if n==0: #基线条件
print('结束')
else: #递归条件
recursive_test(n-1)
recursive_test(5)
输出结果:
这样就是一个简单的递归函数了,递归函数中必须有两个条件。像if n==0 称为基线条件,用来让递归函数停止。else则是递归条件,后面接递归的内容。
再把代码修改下
def recursive_test(n):
print('数字:',n)
if n==0:
print('结束')
else:
recursive_test(n-1)
print('number:',n) #看这里 就加了这一句
recursive_test(5)
打印输出的结果:
!!!!有没有发现什么不同???? 数字是递减的为什么下面输出的顺序和上面不一样是递增的呢???
按理说 这边我们应该要讲到一个东西叫调用栈。容我画个很土的草图
越后面生成的调用栈 越先关闭 ,整个函数就先走完 ,所以后面数字从0开始输出 到5.
这时候也有个问题就是递归函数在运行的时候会在内存中开启很多个栈,占内存,等到运行完才会关闭。性能并不占优势。但在一些复杂的写法上,递归函数的写法 条理会很清晰。让人很好理解。
最后做个案例吧(也可以看我排序算法 中的 快速排序和归并排序的代码)
#快速排序2
lists = [7,5,9,1,8,3,4,2,6]
n = len(lists) #个数
def quick_sort2(lists):
if len(lists)<2: #当列表中只有0或一个数时返回结束递归,即pivot左或右只有1或0个数
return lists
else:
pivot = lists[0] #就取列表的第一个数作为基准
small = [] #创建两个列表存放大于基准和小于基准的数
big = []
for i in lists[1:]: #因为第一个数时基准从第二个数开始遍历
if i<=pivot:
small.append(i)
else:
big.append(i)
lists = quick_sort2(small)+[pivot]+quick_sort2(big) #最后将列表拼接起来。得到的大和小的列表再放入函数中运行排序
return lists
print(quick_sort2(lists))
写个全世界都用来做案例的阶乘算法吧。
5!=5*4*3*2*1
应该都知道吧类似
def factorial(n):
'''阶乘计算'''
if n==1: #基线条件 n==1时返回1
return 1
else: #递归条件
return n*factorial(n-1) #5*4*3*2*1
ret = factorial(5)
print(ret)
感觉自己理解的都讲完了。有什么不对的 也希望大家指出。
有什么问题也可以一起探讨