当前课程知识点:程序设计基础 >  第五章 分治思想与递归 >  5.4 分书与八皇后 >  5.4.5 解题准备——递归设计

返回《程序设计基础》慕课在线视频课程列表

5.4.5 解题准备——递归设计在线视频

5.4.5 解题准备——递归设计

下一节:5.4.6 代码解说——分书问题

返回《程序设计基础》慕课在线视频列表

5.4.5 解题准备——递归设计课程教案、知识点、字幕

我们知道呢

经过刚才分析

这两个问题呢

可以用递归的方法来做

递归里头最重要的一个

需要我们去用的这个函数

所以我们要定义一个核心的函数

来完成这样的一个任务

假定这两个问题里头

我们定义的这个递归的函数

它的名字都叫Try

尝试TRY

尝试什么呢 尝试当前行

它有一个参数(当前行) 即尝试第几行

那么我们知道在递归的程序里头

首要的就是你要去想到递归程序

什么时候中止

所以我们先

在考虑怎么开始我们的工作之前

先要想到将要以一个什么样的形式去结束它

这个也是一个很有趣的思想

那么对于这两个问题

我们经过分析

它们有共同的算法思路

什么时候它们结束了呢

作为一个递归程序来讲就是

当我们所有的行

都尝试完了

那么这个时候就表明了

你找到了一个合理的方案

那如果说

尝试到中途的时候就不行了

那肯定是所有的行

一定是没有完成 对不对

因此 只要是所有的行都做过了

也就是说

现在让你去调用这个Try的时候

你的入口参数

当前行 这个行号

已经超出了这个行的数量的话

这就意味着

所有的行都被试过了

找到了一个合理的方案

把它输出出来 返回

这就是问题归结了一个已知的

你把答案输出出来

这样的一种条件就叫做

它的递归的中止条件

这是我们首先要去写出来的

所以一个递归程序是在

正式开始之前

先要去把中止条件写出来

什么时候中止

然后根据我们前面的分析

在当前行上面一共有5列

或者8列

对于分书的问题它是5列

对于八皇后的问题它是8列

那么这5列或者8列

到底哪一个能够放元素呢

我们前面说过

这些列之间是对等的

所有每一列都有可能

因此我们需要去尝试每一列

所以这个算法的第二步就是

依次去枚举每一列

枚举它干什么呢

看它的函数体

看它的循环体

枚举它的循环体

是该列是不是满足限制条件

对于分书来讲

那就是你这一列

这个人喜欢这一列的书吗

所以满足性的条件啊

这一列的书

有没有被前一列的人分走啊

这就是它的限制条件

一个是喜欢不喜欢 一个是它有没有

有没有被人给用掉啊

那对于八皇后呢

那就是这一列

由于是我们一行一行的摆列棋子

那么前面的行

它有可能占了这一列啊 对不对

所以我们知道这一列

是不是已经有棋子出现

当然我们还得看

这一个位置

是不是在以前的某个棋子的斜线上面

这种对角线上面

换而言之

在它的对角线上面

有没有出现其他的棋子

要经过检查

如果检查说这些限制条件都满足

那就说明这一列就可以去存放了

如果满足条件

则满足下面工作

下面做什么呢

满足条件嘛

那就是一种方案的可能性

雏形就有了

所以我们要记住它

我告诉你说

这一行就选这一列

把它记下来

记住该列

第二

我们前面分析的时候说过

这个每一次的选择

会对后面的

这个元素的摆放

会产生影响

因为它把限制条件改变了

这个在分书和八皇后里边是非常的

显然的一个现象

就是你摆上去之后会照成后面的影响

所以我们要更新这个条件限制

至于这个条件限制表现为什么

我们待会结合着代码来说

好 这是第二步

第三步做好记录的条件分析呢就万事具备了

该干嘛呢

尝试下一行

所以实际上是尝试一个规模更小的子问题

他们的算法都是一样的

所以我们再次调用Try

Try下一行

那么这一个调用下去

那么等它返回的时候就意味着

当前这一列

我已经试过了

它成不成功呢

你不用操心

反正是你试完了

因为这个Try的函数返回来啦

那么下面该干嘛呢

我们该尝试下一列了

但是我们要知道

在上一列尝试的时候呢

我们改变了一些限制条件

Try这个可以看到改变了一些限制条件

所以对于下一个尝试来讲

就有可能产生后遗症 不公平

因此我们需要把

限制条件再把它退还回去

恢复到原来的限制

这一步具体的是怎么做的

那么两个问题里头呢

各有不同的形式

但是呢 它是都符合这个算法的

这一步的说明

也就是回退到以前的状态

把这个呢

有时候简单的称之为回溯

这个就是我们

这两个问题的共同的算法步骤

当然由于这两个问题还是有区别的

所以它们在代码的实现上面呈现出

细微的差别

我们待会对着代码

再来一一的来说明

程序设计基础课程列表:

第一章 编程初步

-1.1 基础知识

--1.1.1 什么是程序?什么是语言?

--1.1.2 什么是程序设计?

--1.1.3 计算机发展史

-1.2 买菜问题

--1.2.1 问题描述

--1.2.2 程序的基本结构

-1.3 数学运算

--1.3.1 数学运算符

--1.3.2 数学函数

-1.4 补充说明

--1.4.1 编程环境的下载与安装

--1.4.2 程序基本结构中的含义

--1.4.3 格式与风格

-1.5 总结

--1.5 总结

-程设论道

--程设论道

-师生问答

--师生问答一:怎样学好程序设计

--师生问答二:语言选择

--师生问答三:关于函数

-第一章 编程初步--语法自测

第二章 变量与代数思维

-2.1 关于超级计算器的几点思考

--2.1.1 关于超级计算器的几点思考

-2.2 电子秤模拟 — 背景介绍及需求分析

--2.2.1 电子秤模拟 — 背景介绍及需求分析

-2.3 电子秤模拟 — 代码实现

--2.3.1 电子秤模拟 — 代码实现

-2.4 变量定义与变量类型

--2.4.1 变量定义与变量类型

-2.5 猜数游戏与数据表示

--2.5.1 猜数游戏与数据表示

-2.6 关于变量的讨论

--2.6.1 变量的初始值

--2.6.2 变量类型

--2.6.3 变量内存单元地址

--2.6.4 存“变量地址”的变量——指针

--2.6.5 指针的 读/写 操作

--2.6.6 指针的 加/减 操作

--公告

-2.7 变量体现的计算思维

--2.7.1 变量体现的计算思维

-程设论道

--程设论道

-师生问答

--师生问答

-第二章 变量与代数思维--语法自测

第三章 逻辑推理与枚举解题

-3.1 谁做的好事——语义表示

--3.1.1 谁做的好事——语义表示

-3.2 谁做的好事——真假检查

--3.2.1 谁做的好事——真假检查

-3.3 谁做的好事——循环枚举

--3.3.1 谁做的好事——循环枚举

-3.4 谁是嫌疑犯——多重循环枚举

--3.4.1 谁是嫌疑犯——多重循环枚举

-3.5 谁是嫌疑犯——破案线索表示

--3.5.1 谁是嫌疑犯——破案线索表示

-3.6 谁是嫌疑犯——用二进制枚举

--3.6.1 谁是嫌疑犯——用二进制枚举

-程设论道

--程设论道一

--程设论道二

--程设论道三

-师生问答

--师生问答一:字符与ASCII码表

--师生问答二:其他循环语句、运算符优先级与变量作用域

-第三章 逻辑推理与枚举解题--语法自测

第四章 筛法与查找

-4.1 插花游戏

--4.1.1 问题提出(求素数)

--4.1.2 函数初探

--4.1.3 运行演示

-4.2 筛法

--4.2.1 筛法思路

--4.2.2 数组的定义

--4.2.3 代码翻译

--4.2.4 运行演示

--4.2.5 小朋友数人数

--4.2.6 运行演示

--4.2.7 韩信点兵

-4.3 线性查找

--4.3.1 扑克查找问题

--4.3.2 扑克查找问题代码翻译

--4.3.3 最小值问题

--4.3.4 最小值问题代码翻译

-4.4 折半查找

--4.4.1 提问

--4.4.2 折半查找思路

--4.4.3 折半查找代码翻译

--4.4.4 折半查找运行演示

-4.5 排序问题

--4.5.1 插入排序

--4.5.2 选择排序

--4.5.3 函数写法

--4.5.4 运行演示

-4.6 总结

--4.6.1 总结

-程设论道

--程设论道一:数组与编码思维

--程设论道二:筛法

-师生问答

--师生问答一:函数与面向过程编程

--师生问答二:数组的下标越界

-第四章 筛法与查找--语法自测

第五章 分治思想与递归

-5.1 阶乘

--5.1.1 阶乘问题

--5.1.2 递归解法

--5.1.3 递归小结

-5.2 排序

--5.2.1 归并排序——总体思路

--5.2.2 归并排序——思路分解

--5.2.3 归并排序——代码解说

--5.2.4 快速排序——总体思路

--5.2.5 快速排序——代码解说

--5.2.6 排序总结

-5.3 矩阵填充

--5.3.1 矩阵填充问题

--5.3.2 代码解说

-5.4 分书与八皇后

--5.4.1 问题描述

--5.4.2 问题分析——共性

--5.4.3 问题分析——区别

--5.4.4 解题准备——二维数组

--5.4.5 解题准备——递归设计

--5.4.6 代码解说——分书问题

--5.4.7 代码解说——八皇后问题

-5.5 青蛙过河

--5.5.1 问题描述

--5.5.2 问题分析——简单情况

--5.5.3 问题分析——复杂情况

--5.5.4 问题分析——一般情况

-程设论道

--程设论道一

--程设论道二

-师生问答

--师生问答一

--师生问答二

-第五章 分治思想与递归--语法自测

第六章 递推与动态规划

-6.1 兔子数列问题

--6.1.1 问题描述

--6.1.2 按大小兔子分别递推

--6.1.3 按总数递推

--6.1.4 不用数组递推

-6.2 分鱼问题

--6.2.1 问题描述

--6.2.2 从A到E递推

--6.2.3 从E到A递推

-6.3 橱窗的插花问题

--6.3.1 问题描述

--6.3.2 题意理解与分析

--6.3.3 用枚举思想解题

--6.3.4 采用递推的优化算法

--6.3.5.1 采用动态规划算法—优化分析

--6.3.5.2 采用动态规划算法—递推代码

--6.3.5.3 采用动态规划算法—计算过程

--6.3.5.4 采用动态规划算法—输出方案

--6.3.6 动态规划总结

-6.4 最长公共子序列问题

--6.4.1 问题描述与理解

--6.4.2 问题分析

--6.4.3.1 动态规划解题(1)

--6.4.3.2 动态规划解题(2)

--6.4.3.3 动态规划代码

-程设论道

--程设论道一

--程设论道二

-师生问答

--师生问答

-第六章 递推与动态规划--语法自测

第七章 文本数据处理

-7.1 统计记录总数

--7.1.1 问题分析

--7.1.2 读文件操作

-7.2 统计活跃用户数

--7.2.1 问题分析

--7.2.2 字符串

--7.2.3 程序翻译与演示

-7.3 统计在线时长

--7.3.1 问题分析

--7.3.2 结构

--7.3.3 程序翻译与演示

--7.3.4 写文件操作

-7.4 总结

--7.4.1 总结

-程设论道

--程设论道

-师生问答

--师生问答

-第七章 文本数据处理--语法自测

第八章 非文本数据处理

-8.1 将数据组织成链表

--8.1.1 链表的基本概念

--8.1.2 代码讲解

--8.1.3 链表遍历与释放

-8.2 提高链表访问效率 —— 哈希链表

--8.2.1 简单的哈希算法

--8.2.2 算法实现

-8.3 以二进制文件存储链表

--8.3.1 二进制文件的操作方法

--8.3.2 代码讲解

-程设论道

--程设论道一

--程设论道二

-师生问答

--师生问答

-第八章 非文本数据处理--语法自测

第九章 可配置的程序设计

-9.1 自动售卖程序

--9.1.1 提出问题与初步设计

--9.1.2 细化实现订单处理

--9.1.3 使程序更健壮

-9.2 配制水果信息

--9.2.1 提出问题与设计文件格式

--9.2.2 实现订单处理功能

-9.3 指定界面语言

--9.3.1 提出问题与命令行参数

--9.3.2 实现程序功能

-程设论道

--程设论道

-师生问答

--师生问答

-第九章 可配置的程序设计--语法自测

5.4.5 解题准备——递归设计笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。