《计算之魂》读书笔记——第2章,从递推到递归

news2024/12/23 5:09:15

我们人类的固有思维方式常常是出于直观的,由近及远、从少到多,这样的思维方式让我们很容易理解具体的事物,却也限制了我们的抽象思维,所以当我们理解远离我们生活经验的事物时,就容易出现障碍。我们人类这种自底向上、从小到大的正向思维,称为“递推思维”。但是“计算思维”则不同,它是一种自顶向下、先全局后局部的逆向思维方式,被称为“递归思维”。作为计算机工程的从业者,我们经常需要从递推思维中抽离出来,转换到计算思维,这就需要我们能够很好地应用递归思想。

相对于我们固有的递推思维,递归思维有两个明显的优势。第一个是,只要解决当前一步的问题,就能解决全部的问题;第二个是,剩余的问题,复制处理当前问题的同一过程即可。当然,这里有两个前提条件:(1) 每一个问题在形式上都是相同的,否则无法通过同一个过程完成不同阶段的计算;(2) 必须有一个结束条件。

虽然在多年前已经接触过递归思想,但当时并没有get到它的妙处,而且还颇以为难以理解,只是应付任务式的使用。现在来读吴军老师的这本书,竟然有种相见恨晚的感觉,边读边不由自主地动手写起代码来了。写都写了,那就来复现两个书中的例题吧。

例题1: 上台阶问题

从第0级开始,每次上1或2级台阶,上到第20级,有多少种走法?

这个题如果从正向递推考虑,其实挺难的,很快思维就乱了。那我们试试用递归的方式来解决。

假定到第20级台阶有F(20)种不同的路径,那么到20之前,按照题目的说法,有1级和2级两种走法,也就是F(20) = F(19) + F(18),以此类推,每个当前台阶的上一步,都有两种走法。所以我们就可以给出一个普遍公式:F(n) = F(n-1) + F(n-2),其中,F(1) = 1, F(2) = 2,(这是因为,到第一级台阶只有1种走法,到第二级台阶有两种走法)。

 上代码,为了简单,用Python实现的。

def func(n):
    assert(n >= 1)
    if n == 1:
        return 1
    elif n == 2:
        return 2
    else:
        return func(n - 1) + func(n - 2)


print("func(20) = ", func(20)) 

运行结果:

func(20) =  10946 

与书上的结果一致。

再来看第二个问题,汉诺塔问题。

例题2:汉诺塔问题

有三根柱子,A、B、T。A柱子上有N个盘子,其中,小盘子必须放在大盘子的上面。按照下面规则把所有盘子从A柱子移到B柱子:

1. 每次只能移动一个盘子;

2. 任何时候小盘子都不能放在大盘子下面;

3. T柱可以用来临时存放盘子,但盘子的次序也不能违反第2条规则。

N=1的时候比较直观,直接将唯一的盘子从A柱移到B柱即可;

N=2的时候也比较简单,先把第一个盘子(最上面的小盘子)从A柱放到T柱,再把第二个盘子(下面的大盘子)从A柱移到B柱,最后把T柱上的小盘子再放到B柱上。

N>=3的时候,就越来越复杂了。

所以接下来,我们还是应用递归思想,要移动最下面的第N个盘子,必须先把上面的N-1个盘子移动到T柱;移动完第N个盘子之后,还要把T柱上的N-1个盘子借助A柱再移动到B柱。重复这个过程,一直到完成移动。

继续上代码:

# Move n dishes from A to B, with T is a middle transfer
# The bigger dishes must be placed under the smaller ones in each column
def Hanoi(n, A, B, T):
    if n > 0:
        Hanoi(n-1, A, T, B)
        print('move dish {} from {} to {}'.format(n, A, B))
        Hanoi(n-1, T, B, A)


Hanoi(4, 'A', 'B', 'T')

 简单起见,测试了1~5个盘子的移动,其中,4个盘子的移动顺序如下:

是不是简洁又完美!

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

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

相关文章

调用万维易源实现天气预测

作者介绍 房庚晨,男,西安工程大学电子信息学院,22级研究生 研究方向:机器视觉与人工智能 电子邮件:1292475736qq.com 王泽宇,男,西安工程大学电子信息学院,2022级研究生&#xff0…

easyui03(tree后台工作)

一.数据库脚本 create table TB_MODULE ( id NUMBER not null, pid NUMBER not null, text VARCHAR2(150) not null, iconcls VARCHAR2(100) not null, url VARCHAR2(100), sort NUMBER not null ) insert into TB_MODULE (id, pid, text, icon…

Android音视频开发实战01-环境搭建

一,FFmpeg介绍 FFmpeg 是一款流行的开源多媒体处理工具,它可以用于转换、编辑、录制和流式传输音视频文件。FFmpeg 具有广泛的应用场景,包括视频编解码、格式转换、裁剪、合并、滤镜等等。官网:https://ffmpeg.org/ FFmpeg 支持各种常见的音视频格式&a…

设置论文中的图、表的题注(小记)

参考b站:毕业论文图表如何自动编号/word图表自动编号/图表编号自动更新 其中,更新图表序号 视频使用ctrlp进入打印再退出,也可以使用altf9进行更新 设置论文中的图、表的题注 step1:设置章节1.1 章节设置字体样式,选择标题11.2 章…

中国人民大学与加拿大女王大学金融硕士项目就像一束光,照亮你的春夏秋冬

不要因为看到别人发光,就默认自己的暗淡。每个人都有自己的闪光时刻,或早或晚。只要努力奋进,你也会拥有。针对金融行业计划在职的人员来说,中国人民大学与加拿大女王大学金融硕士项目就像一束光,照亮了我们的春夏秋冬…

赋能全栈软件,开源软件协调,我对英特尔有了全新认知

文章目录 一、前言二、培养开源文化三、现场展区体验四、软硬协同分论坛,和社区开发者共建生态五、快来加入开源社区吧 一、前言 “开源赋能 普惠未来”,2023 年 6 月 11 日到 13 日,我有幸参加了 2023 开放原子全球开源峰会。 “赋能中国软…

数据结构算法刷题(28)回溯组合型和全排列

剪枝技巧: 思路:剪枝的特点是找特定长度的子集。首先确定大框架,当path的长度等于k的时候,就要更新答案并且return。然后在进行path的元素选择,这里采用倒叙,从i到d(dk-len(path))倒…

MySQL——视图(VIEW)详解

今天我们一起来学起视图(VIEW),那么视图是什么呢?视图有什么作用呢?视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图!带着问题一起来寻找答案吧~~~ 1. 常见的数据库…

【实验】语音识别

为学校数字信号处理实验总结和归纳; 语音识别 题目及相关要求在here. 数据预处理 大致步骤: 获取原始音频 检测 分帧 加窗 特征提取 端点检测 端点检测参数指标相对值初始短时能量高门限50初始短时能量低门限10初始短时过零率高门限10初始短时过零率低…

Web网页制作期末复习(1)——HTML5介绍、HTML5的DOCTYPE声明、HTML基本骨架、标题标签、段落 换行、水平线图片图片路径、超链接

目录 HTML5介绍 HTML5的DOCTYPE声明 HTML基本骨架 标题标签 段落、换行、水平线 图片 图片路径* 超链接 HTML5介绍 HTML5是用来描述网页的一种语言,被称为超文本标记语言。用HTML5编写的文件,后缀以.html结尾 HTML是一种标记语言,标…

在提交代码时有哪些注意事项

分享 10 种适合初学者的技术,这些技术将帮助您立即编写更好的代码。因此,如果您准备好将您的编码技能提升到一个新的水平,请继续阅读! 1. 从计划开始 编写更好代码的最佳方法之一是从计划开始。在开始编码之前,请花几…

SQL详细处理流程.md

连接器:管理连接,权限验证解析器:词法以及语法分析优化器:生成执行计划,选择合适索引执行器:操作引擎获取结果存储引擎:存储数据,提供读写接口

iterm2 ssh免密码登录

不需要下载其他插件,使用脚本 目录 操作步骤如下: 实际举例如下: 1.编写sh文件 2.编辑sh文件 3.进入iterm2,打开profiles,edit profiles 4.验证 扩展 expect脚本 操作步骤如下: 在你电脑你想编辑的…

阿里云国际站:阿里云服务器安全性如何?有哪些安全措施和防护机制?

阿里云国际站:阿里云服务器安全性如何?有哪些安全措施和防护机制?   阿里云服务器安全性简介   作为全球领先的云计算服务提供商,阿里云始终注重保障用户数据安全。在面对各种网络攻击和安全威胁时,阿里云积极构建…

mysqldump 数据备份

使用实例 使用方法 Usage: mysqldump [OPTIONS] database [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3…] OR mysqldump [OPTIONS] --all-databases [OPTIONS] For more options, use mysqldump --help OPTION通常是:-u 用户名 -p …

【计算机网络自顶向下】计算机网络从0到1全篇总结-2023电子科技大学期末考试

相关术语 URI:Uniform Resource Identifier 统一资源标识符,指的是一个资源 URL:Uniform Resource Location 统一资源定位符,URI的子集,用地址定为的方式指定一个资源 URN:Uniform Resource Name 统一资…

基于微信小程序新疆特色产品团购系统设计与实现+第四稿+文档

博主介绍:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 基于微信小程序新疆特色产品团购系统设计与实现第四稿文档 视频演示 视频去哪了呢?_哔哩哔哩_bilibili 系统介绍 2.3.1 主要功能描述 在…

常见技术场景

常见技术场景 1.单点登录这块怎么实现的 1.1 概述 单点登录的英文名叫做:Single Sign On(简称SSO),只需要登录一次,就可以访问所有信任的应用系统 在以前的时候,一般我们就单系统,所有的功能都在同一个…

我准备蓝桥杯的这一年

我准备蓝桥杯的这一年 文章目录 我准备蓝桥杯的这一年起步和目标确定渐入佳境焦虑疲惫,一天又一天国赛我来力总结 我将我这段 流水账分为四个阶段。谨以此文,祭奠我这一年来的焦虑、白发~ ,最终也取得了预期的成绩。不知未来再看此章会作何感…

hadoop基础

FileSystem使用 核心类 org.apache.hadoop.fs.FileSystem 文件系统类 抽象类 //静态方法创建对象 public static FileSystem newInstance(URI uri,Configuration conf,String user) /*参数一 URI 分布式文件系统 HDFS的资源地址 NN地址 hdfs://linux01:8020参数二 Configu…