递归调用的思想源于哪个数据结构(什么是递归调用)
递归调用的思想源于哪个数据结构(什么是递归调用)def fib(x): if x < 2: return 0 if x == 0 else 1 # 当x > 2时,开始递归调用fib()函数: return fib(x - 1) fib(x - 2) print(fib(6)) # 打印结果为:8遍历文件有关递归应用的应用有很多,例如注明的斐波拉契数列就可以通过递归来实现: 假设我们现在都不知道什么是递归,我们自然想到打开浏览器:输入到谷歌的网页,点击搜索递归,然后在为维基百科中了解到了递归的基本定义。在了解到了递归实际上是和栈有关的时候,你又蒙圈了,什么是栈呢?数据结构没学清楚,此时的你只能打开谷歌,搜索什么是栈。接下来你依次了解了内存/操作系统。在你基本了解好知识之后,你通过操作系统了解了内存,通过内存了解了栈,通过栈了解了什么是递归这下你恍然大悟!原来这就是递归啊!这下应
昨天有同事问我什么是递归?当他问这个问题的时候我其实知道他想问的是在什么情况下使用递归。
在写递归之前我们先给大家讲一个故事。
从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山...
从严格意义上来说这并不能称之为递归,因为他陷入了一个死循环。我们在写程序中是不能出现这种情况的,因为没有任何意义。
假设我们现在都不知道什么是递归,我们自然想到打开浏览器:输入到谷歌的网页,点击搜索递归,然后在为维基百科中了解到了递归的基本定义。在了解到了递归实际上是和栈有关的时候,你又蒙圈了,什么是栈呢?数据结构没学清楚,此时的你只能打开谷歌,搜索什么是栈。接下来你依次了解了内存/操作系统。在你基本了解好知识之后,你通过操作系统了解了内存,通过内存了解了栈,通过栈了解了什么是递归这下你恍然大悟!原来这就是递归啊!
这下应该有点明白了吧,这个过程其实就是递归的过程。如果不了解递归,那就先了解什么是递归,可能你会说这是个循环并不是递归,我们前面说到,递归是需要终止条件的,那么你明白递归是什么其实就是终止条件。整个过程,搜索引擎充当递归函数(只是形象的假设)。在你去依次查找递归/栈/内存/操作系统的过程为前行阶段,在你都了解完之后,反回去了解含义的过程为退回阶段。
下面这张图可能表达更为直观一点
有关递归应用的应用有很多,例如注明的斐波拉契数列就可以通过递归来实现:
def fib(x):
if x < 2:
return 0 if x == 0 else 1
# 当x > 2时,开始递归调用fib()函数:
return fib(x - 1) fib(x - 2)
print(fib(6)) # 打印结果为:8
遍历文件
import os
def file_display(filepath):
for each in os.listdir(filepath):
# 得到文件的绝对路径:
absolute_path = os.path.join(filepath, each)
# 得到是否为文件还是目录的布尔值:
is_file = os.path.isfile(absolute_path)
if is_file:
# 当前的绝对路径为文件:
print(each)
else:
# 当前的绝对路径为目录:
file_display(absolute_path)
file_display('/home/pushy')
递归和循环
我自己感觉递归和循环最大的区别是循环就像在同一个地方打转;递归是一层一层进入,再原路返回,虽然每一层都一样。在上面的斐波拉契数列的例子中 有人的可能把初始的数字改的很大会发现报错,计算不出结果。难道是我们的算法错了吗?我们的算法显然是没有错的。这也就是递归存在的问题,那就是空间复杂度在增大。而我们的电脑的内存是有限制的并不能无限制的开辟空间。所以我们在写程序的时候要估算一下程序的递归层级。
关于循环和递归,以上就是我的理解。欢迎大家私信,评论。