什么是递归?首先了解什么是递归.

电脑杂谈  发布时间:2020-06-23 01:15:42  来源:网络整理

递归_递归_二叉树的递归及非递归遍历

欢迎阅读我的个人博客,其中包含更好的布局和文章:

关于递归,我认为每个人都不陌生. 举一个我从小就听到的例子: 曾经有一座山,一座山上有一座寺庙,这座寺庙里有一个和尚,和尚讲故事,过去有一座山,有一个在山上的一座寺庙里,寺庙里有一个和尚,和尚在讲一个故事,曾经有一座山...

您还可以从两个相对的镜子中看到图片,它们实际上是抽象的递归现象,但严格来说,它们不是递归的,因为它们将一直重复并且没有终止条件,这称为无穷循环. 太. 稍后我们将讨论递归和无限循环之间的异同,所以让我们首先了解什么是递归?

那么什么是递归?要了解递归,您必须首先了解什么是递归. 实际上,这句话是递归的. 这可能很难理解. 接下来,我将给出一个简单的示例来说明此段落的含义.

假设我们现在甚至都不知道递归,我们自然会考虑打开浏览器: 输入Google的网页,单击搜索递归,然后在Wikipedia中学习递归的基本定义. 在了解到递归实际上与堆栈有关之后,您将再次陷入循环. 什么是堆栈?数据结构不清楚. 目前,您只能再次打开Goog​​le并搜索堆栈. 接下来,您依次了解了内存/操作系统. 充分了解基本知识之后,您将通过操作系统了解内存,通过内存了解堆栈,并通过堆栈进行递归. 现在你突然明白了!所以这是递归!

现在应该有点清楚了. 此过程实际上是一个递归过程. 如果您不了解递归,则应首先了解什么是递归. 也许您会说这是一个循环而不是递归. 前面我们说过递归是如果您需要终止条件,那么您了解什么递归实际上是终止条件. 在整个过程中,搜索引擎充当递归函数(仅是图像假设). 依次查找递归/堆栈/内存/操作系统的过程是前进的阶段. 在理解它之后,回到理解含义的过程就是返回阶段. 如果仍然不清楚递归,您可以继续查看以下示例.

二叉树的递归及非递归遍历_递归_递归

也许您以前在互联网上看过这张照片:

xiaoliyu.jpg

实际上,这张图片非常生动地表达了递归. 这句话吓到我抱着我抱着小鲤鱼的拥抱. 如果从字面上看,我可能看不到. 这是什么意思,那么我们可以通过代码达到相同的效果:

function Recursion(depth) {
    console.log('抱着');
    if (!depth) {
        console.log('我的小鲤鱼')
    } else {
        Recursion(--depth);  // 递归调用
    }
    console.log('的我');
}
console.log('吓得我抱起了');
Recursion(2)

在终端上的打印结果如下,可以看到与上一段相同:

xiaoliyuconsole.png

递归_递归_二叉树的递归及非递归遍历

该代码实际上非常简单,但是需要理解,if代码块的条件(!depth)是递归调用的终止条件,并且该函数在else代码块中被递归调用. 前面我们提到过递归的过程是在前进和后退之前,然后在前一阶段,在每次调用该函数之后,我们打印出“保持”字样递归,并在depth≠0时重新调用该函数. 在后台,将执行代码console.log('的我');然后打印出“的我”.

储月月的照片也可以更清楚地反映这一过程:

enterReturn.jpg

好吧!现在您应该了解什么是递归?如果您不了解什么是递归,则可以看到什么是递归?

有许多与递归应用程序有关的应用程序. 例如,可以通过递归实现标注的斐波那契数列:

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

二叉树的递归及非递归遍历_递归_递归

这里需要判断i <2时的特殊情况,x == 0时直接返回0,x == 1时直接返回1

首先,我们需要了解遍历算法: 定义的file_display函数以某个目录(/ home / pushy)作为遍历的起点. 当遇到子目录时,它首先遍历子目录(递归调用该函数). 遇到文件时,可以直接对更改后的文件进行操作(仅在此处打印文件的文件名):

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')

这样我们就可以遍历/ home / pushy路径下的所有文件:

readFile.png

我们还可以使用递归来创建目录:

递归_递归_二叉树的递归及非递归遍历

import os
def createFile(dirname):
    exits = os.path.exists(dirname)
    if exits:
        return True
    else:
        # 开始递归调用函数,并接受其返回值:
        rec_result = createFile(os.path.dirname(dirname))
        if rec_result:
            # 如果不存在该目录,则创建dirname的目录,并返回已经创建(存在)的值True:
            os.mkdir(dirname)
            return True
createFile('./aa/bb/cc')

好的,递归知识几乎完成了. 如果您阅读以上内容,则可能已经知道循环和递归之间的区别. 而已!简单来说,循环没有返回,而递归也有返回(因为存在终止条件).

带一个栗子,您用手中的钥匙打开一扇门,发现前面还有另一扇门,然后您再次用钥匙打开门,然后又看到了另一扇...但是当您打开一扇门,您会发现前方有一堵墙,无路可走. 您选择以相同的方式返回-这就是递归

但是,如果您打开一扇门,也会发现前面有一个人,然后又打开了下一扇门...直到您打开最后一扇门出去,或者您永远都不会撞到尽头循环)-这是循环.

参考:

[了解]什么是递归


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-255032-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...