递归
递归在我们编写算法中非常常见,很多算法都是通过递归来实现,递归虽然使用简单,但是想了解其内部流程没有那么简单的。
什么是递归呢?
递归重在搞明白内在的过程,不能之前然而不知其所以然
比如二叉树的深度优先遍历,斐波那契额数列,这些写起来很简单,但是像是回溯就比较难了,如果对递归的本质理解不透彻的话,就写不出正确的算法来
递归最常见的定义:
函数内部调用函数本身。那么这个函数就是递归函数,其本质还是一个循环
递归分为两个过程:一个是‘递’,一个是‘归’,这些都是自动化完成的
递归一定要设置终止条件:递归一定要终止,怎么写终止条件很重要
递归实现斐波拉契数列
斐波拉契数列又称黄金分割数列,也叫兔子数列
指的是这样的一个数量,1,2,3,5,8,13,21,34,…后边的数等于前边的数之和,我们要解决的是100个数是多少
#1.什么地方调用递归本身
#2.什么时候终止递归
#1 1 2 3 5 8 13 21
import time
total = {}
def fib_test(k):
"""
#求解第k个数的值
:param k: 求解第几个数
:return:
"""
assert k > 0, '\nk必须大于0'
if k in [1,2]: #终止递归
return 1
global total
if k not in total:
total[k] = 1
else:
total[k] += 1
return fib_test(k-1) + fib_test(k-2)
def fib_test2(k):
# assert k > 0,'\nk必须大于0'
# if k in [1,2]:
# return 1
k_1 = 1
k_2 = 1
for i in range(3,k+1):
tmp = k_1
k_1 = k_1 + k_2
k_2 = tmp
return k_1
if __name__ == '__main__':
from datetime import datetime
start_time = datetime.now()#记录时间
print(fib_test(35))#算法
print('递归耗时:{}'.format((datetime.now()-start_time).total_seconds()))#递归时间
print(total)#每个k重复计算次数
待续。。。 。。。
来源:CSDN
作者:Millet。
链接:https://blog.csdn.net/enemy_sprites/article/details/103642141