有趣的递归(Recursion),一些直观的示例

从前有座山, 山上有座庙, 庙里有个老和尚在给小和尚讲故事: “从前有座山, 山上有座庙, 庙里有个老和尚在给小和尚讲故事: …”

反复而纠结的定义

看完这个故事, 对递归你已经有了印象, 很好, 这样已足够. 如果你不幸是个喜欢精确定义的人, 那么答案可能无法让你满意:

你想知道递归是什么, 你得先知道什么是递归.

To understand recursion, you must understand recursion.

把你绕晕了没有? 你可能想这叫啥子定义哟. 如果你去谷歌英文页搜索"recursion", 谷歌就会给你来这么一下:

谷歌搜索递归

谷歌说: “你是说递归吗? (Did you mean: recursion)”.

拼写绝对是正确的, 这不过是谷歌给你开的"递归式"的玩笑.

说完了谷歌, 再说说必应(Bing), Bing 是什么意思呢:

Bing = Bing is not google(Bing 不是谷歌)

你还是不满意, 那再看看 GNU, GNU 又是啥呢:

GNU = GNU’s Not Unix(GNU 不是 Unix)

收敛的递归

好了, 这些无限递归可能让你有点烦闷了, 让我们看点会收敛的:

蒙娜丽莎 递归

你是否想起了这样的诗句:

你站在桥上看风景

看风景的人在楼上看你

明月装饰了你的窗子

你装饰了别人的梦

–卞之琳<<断章>>

再来看看据说是 MIT 计算机系的徽标:

MIT 计算机系校徽 递归

MIT: MASSACHUSETTS INSTITUTE OF TECHNOLOGY 麻省理工学院

麻省: 即马萨诸塞州

图上有个 lambda(λ), 至于那个 (Y F)=(F (Y F)), 有没有哪头技术大奶牛知道它是啥呢?

不太清楚这玩意是啥~但公式可参见: http://en.wikipedia.org/wiki/Fixed-point_combinator#Y_combinator

另可参考 mindhacks.cn 上的这篇康托尔, 哥德尔, 图灵–永恒的金色对角线(rev#2)(没怎么看懂~有兴趣有精力的同学可钻研看看. )

自相似性(self-similarity)

下面是一颗自然界的完全二叉树(A complete binary tree in nature, 来自http://www.cs.haifa.ac.il/~shlomit/, 作者摄于非洲)

自然界的完全二叉树

下图为芒德布罗集(**Mandelbrot set), 分形(Fractal)**理论中的一个概念:

芒德布罗集 分形

这个图很好体现了一种自相似性, 实际上, 不断放大这个图会发现模式在不断重复.

来自优酷的这个视频展示了这一点: http://v.youku.com/v_show/id_XMTc3NzIyMjI0.html

内容来自数学科教影片<<维度: 数学漫步>> http://www.dimensions-math.org/Dim_ZH_si.htm

如果你有兴趣, 还有另一部<<混沌: 数学漫步>>http://www.chaos-math.org/zh-hans

其它示例

艾舍尔版画(来自http://www.guokr.com/blog/50805/)

艾舍尔版画 递归的鱼

这里的艾舍尔就是那本<<哥德尔, 艾舍尔, 巴赫–集异璧之大成>>(Gödel, Escher, Bach: an Eternal Golden Braid)中的艾舍尔了.

见http://book.douban.com/subject/1291204/

我发现此书英文版居然早在 1979 年就出版了, 作者 Douglas Hofstadter 还取了个中文名叫"侯世达".

下图则为电影<<盗梦空间>>(Inception)中的一幕(其实这种场景在理发店也很常见~):

盗梦空间 递归的镜子

电影情节中的梦中梦也颇有递归的意味.

制造递归

如果你有个可移动的摄像头, 让屏幕上播放摄像头实时拍摄的画面, 然后拿着摄像头对准屏幕, 就能得到类似下图中的效果:

摄像头拍屏幕 制造递归

你可以想想, 为什么会这样呢?

与此相似的一个例子是音箱的爆音, 在一些会场, 有时会不小心把麦克风对谁了音箱, 大功率音箱一开始存在一些很小的电流声, 这些声音被麦克风捕获又传入音箱再次放大又传到麦克风上…很快就会演变成刺耳的尖锐声.

程序中的递归

文件夹的递归结构:

文件夹中的递归

所以, 用递归去处理这些是很常见的情形. 类似的还包括那些有着树形结构特点的如 XML, HTML

以及 Chrome 浏览器中 window 对象的自指递归:

javascript window 对象的自指递归

window 对象是 javascript 在浏览器端的扩展中的全局对象(类似 node.js 中的 global), 它里面又包含了一个名为 window 的属性指向它自身, 所以可以像上图那样无限展开.

遍历处理这种结构需要特别小心, 否则很可能会收到 stack overflow 的错误~

以上谈了不少的例子, 都没有涉及具体的编程, 是想让大家对递归有一个直观的印象先, 后面会谈到一些经典的例子, 如阶乘以及菲波那契数列, 还有用递归来做排序(如简单的冒泡排序), 最后将展示一个用递归方式来计算换零钱种数的例子(比如用 100 元, 换成 50, 20, 10, 5, 1 元的组合总共有几种), 从中可以体现递归的优势.

由于篇幅有限, 这些将在后续篇章中谈及.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/40362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java考试题20道

选择题 编译Java源代码文件的命令是javac javac命令是将Java源代码文件进行编译得到字节码文件(.class文件) java命令是在JVM上运行得到的字节码文件 下面是一个示例&#xff1a; javac test.java -------> test.class java test ------> 运行test.class文件下列那…

vue3 在el-input的光标处插入文本

点击文本框下方的按钮&#xff0c;将相应的文本插入光标处的实现&#xff1a; <el-input type"textarea" rows"4" v-model"formula" blur"handleBlur" clearable></el-input><el-button-group class"short_btn&q…

63、基于深度学习网络的数字分类(matlab)

1、基于深度学习网络的数字分类的原理及流程 基于深度学习网络的数字分类是一种常见的机器学习任务&#xff0c;通常使用的是卷积神经网络&#xff08;CNN&#xff09;来实现。下面是其原理及流程的简要说明&#xff1a; 数据收集&#xff1a;首先&#xff0c;需要收集包含数字…

【shell script】

文章目录 一、基础shell script二、脚本运行方式的差异三、判断式1.利用test命令2.利用判断符号[] 四、if&#xff0c;case语句1.if...then2.case...esac 五、函数function六、循环1.while和until循环2.for循环 一、基础shell script 在“shell”部分&#xff0c;那是在命令行…

Flutter——最详细(Badge)使用教程

背景 主要常用于组件叠加上圆点提示&#xff1b; 使用场景&#xff0c;消息数量提示&#xff0c;消息红点提示 属性作用backgroundColor红点背景色smallSize设置红点大小isLabelVisible是否显示offset设置红点位置alignment设置红点位置child设置底部组件 代码块 class Badge…

从数据洞察到智慧决策:数字孪生技术在智慧水利中的应用实践,为水库管理提供强有力的数据支撑和智能分析

目录 一、引言 二、数字孪生技术的核心与原理 三、数字孪生技术在智慧水利中的应用场景 1、水库管理的挑战与需求 2、数字孪生水库管理系统的构建 四、数字孪生技术在水库管理中的具体应用案例 1、洪水预测与模拟 2、水资源配置与调度 3、大坝安全监测与评估 4、生态环…

【C++/STL深度剖析】stack和queue的详细概念和使用(图文详解,初学者必看!!)

目录 一、前言 二、stack 的详细解析 &#x1f525; stack的介绍&#x1f525; &#x1f525; stack的构造&#x1f525; &#x1f525; stack的常用接口&#x1f525; &#x1f4a7;push &#x1f4a7;top &#x1f4a7;pop &#x1f4a7;empty &#x1f4a7;size…

Android文件路径获取

文件存储相关的文档 文件存储相关的系列文档如下&#xff0c;可根据需要查看这些文档 Android文件路径获取 Android存储权限梳理及api接口调用 Android各种存储路径的比较 Android R及以上版本中APP外部存储实现 Android文件路径获取 在Android开发中&#xff0c;经常需要…

24位DAC转换的FPGA设计及将其封装成自定义IP核的方法

在vivado设计中,为了方便的使用Block Desgin进行设计,可以使用vivado软件把自己编写的代码封装成IP核,封装后的IP核和原来的代码具有相同的功能。本文以实现24位DA转换(含并串转换,使用的数模转换器为CL4660)为例,介绍VIVADO封装IP核的方法及调用方法,以及DAC转换的详细…

REGX52.H报错

keil cannot open source input file "REGX52.H": No such file or directory 选择下面这个目录 Keil\C51\INC\Atmel

Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL

章节内容 上一节我们完成了&#xff1a; Reduce JOIN 的介绍Reduce JOIN 的具体实现DriverMapperReducer运行测试 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&am…

无人机在航拍领域有哪些独特优势?

那肯定是便宜啊&#xff0c;相比传统的飞机或直升机航拍作业&#xff0c;无人机航拍具有更快的响应速度和更低的成本。无人机可以随时随地进行起降&#xff0c;并在短时间内完成航拍任务&#xff0c;极大地提高了作业效率。同时&#xff0c;无人机的运营成本相对较低&#xff0…

Mac如何杀毒?Mac电脑如何杀毒 mac杀毒软件推荐 mac杀毒软件哪个好用

Mac的轻薄和便携是众多白领选择它作为办公PC的原因&#xff0c;而除此之外&#xff0c;Mac另一个被人选择的原因&#xff0c;是macOS 系统特有的安全性。因此许多人以为&#xff0c;Mac不需要安装专门的杀毒软件。然而事实并非如此&#xff01; 每年都会出现许多恶意软件准们针…

昇思学习打卡-3-张量Tensor

本章节系统的学习了张量的相关内容&#xff0c;张量是由若干个当坐标系改变时满足转换关系的分量组成的集合。它是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数。是一种类似于矩阵的特殊的数据结构。包括 创建张量的方式&#xff1b;张量的属性&#…

解决:使用MySQL Command Line Client时光标不显示

问题描述: 使用MySQL Command Line Client时&#xff0c;命令行输入字符光标不显示, 如下图: 解决办法: 1.按Shift键将输入法切换至中文,打出中文: 2.再按一次Shift键,光标就会显示:

工作助手VB开发笔记(1)

1.思路 1.1 样式 样式为常驻前台的一个小窗口&#xff0c;小窗口上有三到四个按钮&#xff0c;为一级功能&#xff0c;是当前工作内容的常用功能窗口&#xff0c;有十个二级窗口&#xff0c;为选中窗口时的扩展选项&#xff0c;有若干后台功能&#xff0c;可选中至前台 可最…

antd+vue——实现table组件跨页多选,已选择数据禁止第二次重复选择

需求场景&#xff1a;点击【新增】按钮可以在分页弹窗中跨页多选选择数据后添加到页面中&#xff0c;再次点击【新增】&#xff0c;已经选择过的数据则置灰不让重复选择。 选择后&#xff0c;置灰 点击【确定】数据添加到页面中&#xff0c;可再次点击【新增】进行添加数据 …

项目上线文档编写指南

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

Ollama + Docker + AnythingLLM 搭建本地多用户AI知识库

整个过程需要准备三个工具&#xff1a; Ollama&#xff1a; 用于运行本地大模型的管理&#xff1a;llama3, qwen2等 Docker&#xff1a;用于运行AnythingLLM。 AnythingLLM&#xff1a;知识库运行平台&#xff0c;提供知识库构建及运行的功能。 Ollama, Docker 这二个安装不…

等保测评——云计算测评项2

安全计算环境-身份鉴别 当远程管理云计算平台中设备时&#xff0c;管理终端和云计算平台之间应建立双向身份验证机制&#xff1b; 远程管理云计算平台中的设备时&#xff0c;双向身份验证机制确保了管理终端和对端服务器的真实性&#xff0c;有效防止了重放攻击和DoS攻击,大大…