算法小专栏开篇:DFS之Fibonaci数列
Preface
从今天开始会给大家介绍一些我在学习软件算法时期的一些题目或者笔记总结,本身我也不是计软班科的,也不是打ACM的,所以也不要指望我来给你讲解Leetcode或者Linkcode了,遇到Hard题在下实在也是爱莫能助。
一些关于计算机专业术语的词我会比较少用,采用一些直观的数据来体现~
年轻人不讲code德,各种剪枝优化,各种记忆法,各种退出条件,咳咳咳……(吐血ing
Brief Introduction to DFS
今天从**DFS(深度优先搜索)**开始,一开始学的时候老师给了道测试题,我直接懵了,DFS?可能大计基的时候或者学C语言的时候讲过,简单的结构还是会的。后面开始去刷题,啊嘞?
但是现在来看其实DFS其是以套路为先,判断逻辑为主,剪枝优化为辅的一种算法思路。
好啦,我们来大概介绍一下,深度优先搜索DFS和广度优先搜索BFS是两种很重要的软件算法,在图论里面有很多应用,像最短路径,全局查找等优化问题。
深度优先,即是在当前既定的搜索策略下不断进行下去,一条路走到黑。可以这么说,如果行不通了,退出当前的循环,改变搜索策略,继续循环往复,直到找到出口,是不是很像小白鼠走迷宫。
意思很好懂,我认为有关键三个点:
-
第一个是搜索策略,这是核心算法,自不用多说
-
第二个是循环的前后参量传递,即我走过的路我不走了,或者通过一条失败的路pass掉其他n条类似的路直接不走,节省时间空间,其中一些变量的传递。
-
第三个是退出条件,没有退出条件,就是无限循环,Happy Ending!
上面的 Key Point 会在以后的内容里在逐步体现~大家也不用有太多心里负担,就当小百科。
Implementation of Fibonaci using DFS
今天我还是从 Fibonaci(斐波那契数列) 开始,给大家介绍DFS。
所用环境是 Windows10+Python3.7。
语法都是很简单的,本身就是解释性语言,通俗易懂。
斐波那契数列很常见:1,1,2,3,5,……
从第三项开始,每一项都是前两项的和。假设我要求第n项,我是不是要知道第n-1项和第n-2项,要求第n-1项,又要知道第n-2项和第n-3项,以此类推,就是一个不断循环的过程,啥时候是个头呢?
我们知道第一项和第二项都是1,那当递归到这两项时,直接返回1便可以了。就好像在一个迷宫,每一层有一个房间,每一层的房间里有打开上一层需要的钥匙,最上面一层的房间有奥利奥,怎么吃到奥力给呢?
直观思路:你只需要走到最低的一层,拿到最低两层的钥匙,便可以一直往上走,期间不断开门,收集钥匙,直到打开最上面一层的房间。
来看看code:
def fibonaci():
"""
Function: get n_th value in Fibonacci_array using DFS
Returns: None
""&#