python算法攻坚

不想你离开。 提交于 2019-12-23 04:06:23

递归

递归在我们编写算法中非常常见,很多算法都是通过递归来实现,递归虽然使用简单,但是想了解其内部流程没有那么简单的。

什么是递归呢?

递归重在搞明白内在的过程,不能之前然而不知其所以然

比如二叉树的深度优先遍历,斐波那契额数列,这些写起来很简单,但是像是回溯就比较难了,如果对递归的本质理解不透彻的话,就写不出正确的算法来

递归最常见的定义:
函数内部调用函数本身。那么这个函数就是递归函数,其本质还是一个循环

递归分为两个过程:一个是‘递’,一个是‘归’,这些都是自动化完成的

递归一定要设置终止条件:递归一定要终止,怎么写终止条件很重要

递归实现斐波拉契数列

斐波拉契数列又称黄金分割数列,也叫兔子数列
指的是这样的一个数量,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重复计算次数

待续。。。 。。。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!