当前课程知识点:程序设计基础 > 第五章 分治思想与递归 > 5.4 分书与八皇后 > 5.4.5 解题准备——递归设计
我们知道呢
经过刚才分析
这两个问题呢
可以用递归的方法来做
递归里头最重要的一个
需要我们去用的这个函数
所以我们要定义一个核心的函数
来完成这样的一个任务
假定这两个问题里头
我们定义的这个递归的函数
它的名字都叫Try
尝试TRY
尝试什么呢 尝试当前行
它有一个参数(当前行) 即尝试第几行
那么我们知道在递归的程序里头
首要的就是你要去想到递归程序
什么时候中止
所以我们先
在考虑怎么开始我们的工作之前
先要想到将要以一个什么样的形式去结束它
这个也是一个很有趣的思想
那么对于这两个问题
我们经过分析
它们有共同的算法思路
什么时候它们结束了呢
作为一个递归程序来讲就是
当我们所有的行
都尝试完了
那么这个时候就表明了
你找到了一个合理的方案
那如果说
尝试到中途的时候就不行了
那肯定是所有的行
一定是没有完成 对不对
因此 只要是所有的行都做过了
也就是说
现在让你去调用这个Try的时候
你的入口参数
当前行 这个行号
已经超出了这个行的数量的话
这就意味着
所有的行都被试过了
找到了一个合理的方案
把它输出出来 返回
这就是问题归结了一个已知的
你把答案输出出来
这样的一种条件就叫做
它的递归的中止条件
这是我们首先要去写出来的
所以一个递归程序是在
正式开始之前
先要去把中止条件写出来
什么时候中止
然后根据我们前面的分析
在当前行上面一共有5列
或者8列
对于分书的问题它是5列
对于八皇后的问题它是8列
那么这5列或者8列
到底哪一个能够放元素呢
我们前面说过
这些列之间是对等的
所有每一列都有可能
因此我们需要去尝试每一列
所以这个算法的第二步就是
依次去枚举每一列
枚举它干什么呢
看它的函数体
看它的循环体
枚举它的循环体
是该列是不是满足限制条件
对于分书来讲
那就是你这一列
这个人喜欢这一列的书吗
所以满足性的条件啊
这一列的书
有没有被前一列的人分走啊
这就是它的限制条件
一个是喜欢不喜欢 一个是它有没有
有没有被人给用掉啊
那对于八皇后呢
那就是这一列
由于是我们一行一行的摆列棋子
那么前面的行
它有可能占了这一列啊 对不对
所以我们知道这一列
是不是已经有棋子出现
当然我们还得看
这一个位置
是不是在以前的某个棋子的斜线上面
这种对角线上面
换而言之
在它的对角线上面
有没有出现其他的棋子
要经过检查
如果检查说这些限制条件都满足
那就说明这一列就可以去存放了
如果满足条件
则满足下面工作
下面做什么呢
满足条件嘛
那就是一种方案的可能性
雏形就有了
所以我们要记住它
我告诉你说
这一行就选这一列
把它记下来
记住该列
第二
我们前面分析的时候说过
这个每一次的选择
会对后面的
这个元素的摆放
会产生影响
因为它把限制条件改变了
这个在分书和八皇后里边是非常的
显然的一个现象
就是你摆上去之后会照成后面的影响
所以我们要更新这个条件限制
至于这个条件限制表现为什么
我们待会结合着代码来说
好 这是第二步
第三步做好记录的条件分析呢就万事具备了
该干嘛呢
尝试下一行
所以实际上是尝试一个规模更小的子问题
他们的算法都是一样的
所以我们再次调用Try
Try下一行
那么这一个调用下去
那么等它返回的时候就意味着
当前这一列
我已经试过了
它成不成功呢
你不用操心
反正是你试完了
因为这个Try的函数返回来啦
那么下面该干嘛呢
我们该尝试下一列了
但是我们要知道
在上一列尝试的时候呢
我们改变了一些限制条件
Try这个可以看到改变了一些限制条件
所以对于下一个尝试来讲
就有可能产生后遗症 不公平
因此我们需要把
限制条件再把它退还回去
恢复到原来的限制
这一步具体的是怎么做的
那么两个问题里头呢
各有不同的形式
但是呢 它是都符合这个算法的
这一步的说明
也就是回退到以前的状态
把这个呢
有时候简单的称之为回溯
这个就是我们
这两个问题的共同的算法步骤
当然由于这两个问题还是有区别的
所以它们在代码的实现上面呈现出
细微的差别
我们待会对着代码
再来一一的来说明
-1.1 基础知识
-1.2 买菜问题
-1.3 数学运算
-1.4 补充说明
-1.5 总结
--1.5 总结
-程设论道
--程设论道
-师生问答
-第一章 编程初步--语法自测
-2.1 关于超级计算器的几点思考
-2.2 电子秤模拟 — 背景介绍及需求分析
-2.3 电子秤模拟 — 代码实现
-2.4 变量定义与变量类型
-2.5 猜数游戏与数据表示
-2.6 关于变量的讨论
--公告
-2.7 变量体现的计算思维
-程设论道
--程设论道
-师生问答
--师生问答
-第二章 变量与代数思维--语法自测
-3.1 谁做的好事——语义表示
-3.2 谁做的好事——真假检查
-3.3 谁做的好事——循环枚举
-3.4 谁是嫌疑犯——多重循环枚举
-3.5 谁是嫌疑犯——破案线索表示
-3.6 谁是嫌疑犯——用二进制枚举
-程设论道
--程设论道一
--程设论道二
--程设论道三
-师生问答
-第三章 逻辑推理与枚举解题--语法自测
-4.1 插花游戏
-4.2 筛法
-4.3 线性查找
-4.4 折半查找
--4.4.1 提问
-4.5 排序问题
-4.6 总结
--4.6.1 总结
-程设论道
--程设论道二:筛法
-师生问答
-第四章 筛法与查找--语法自测
-5.1 阶乘
-5.2 排序
-5.3 矩阵填充
-5.4 分书与八皇后
-5.5 青蛙过河
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答一
--师生问答二
-第五章 分治思想与递归--语法自测
-6.1 兔子数列问题
-6.2 分鱼问题
-6.3 橱窗的插花问题
-6.4 最长公共子序列问题
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第六章 递推与动态规划--语法自测
-7.1 统计记录总数
-7.2 统计活跃用户数
-7.3 统计在线时长
--7.3.2 结构
-7.4 总结
--7.4.1 总结
-程设论道
--程设论道
-师生问答
--师生问答
-第七章 文本数据处理--语法自测
-8.1 将数据组织成链表
-8.2 提高链表访问效率 —— 哈希链表
-8.3 以二进制文件存储链表
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第八章 非文本数据处理--语法自测
-9.1 自动售卖程序
-9.2 配制水果信息
-9.3 指定界面语言
-程设论道
--程设论道
-师生问答
--师生问答
-第九章 可配置的程序设计--语法自测