- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
计算机程序设计基础——第八讲
* * 下楼问题 第八讲 递归算法举例 八皇后问题 讨论问题 “下楼问题” 从楼上走到楼下共有h个台阶,每一步有三种走法 走一个台阶; 走二个台阶; 走三个台阶。 问可走出多少种方案,希望用递归思想来编程。 定义: Try(i,s)——站在第i级台阶上往下试走第s步的过程 j=1,2,3 —— 在每一步可以试着走的台阶数 take[s] —— 存储第s步走过的台阶数 ij —— 说明第i级台阶已比要走的j级台阶小,j不可取 ij —— 说明站在第i级台阶上可试走j个台阶为一步 i==j —— 说明这一步走完后已到了楼下,这时一条下楼方案已试成,即可输出这一方案了 思路: 1、用枚举的方法,试着一步一步地走,从高到低,让i先取h值从楼上走到楼下,每走一步i的值会减去每一步所走的台阶数j,即i=h(初值),以后i=i-j,(j=1,2,3),当i=0时,说明已走到楼下。 2、枚举时,每一步都要试j或者是为1,或是为2,或是为3。这时可用for循环结构。 3、每一步走法都用相同的策略,故可以用递归算法。 见图 在上图中,A结点是被递归调用的结点,形式参数为i,s,A结点为一个与结点,进入B结点时的三个参数为i,s,j=3;进入C结点的参数为i,s,j=2;进入D结点的参数为i,s,j=1。Lp是三个结点都可用的循环体Lp。 Lp是一个分支结构的或结点。 (1)当ij时,说明第i级已经比一步该走的台阶数小了。这是一个直接可解结点E,什么也不做。 (2)当i=j时,要做相关联的G和H,G是直接可解结点,将第s步走过的台阶数j记入take数组,即take[s]=j;接着做H,H为或结点,有两个分支: 其一是:当i==j时,说明经过第s步,已走到楼下,输出该下楼行走方案,并将方案号加1; 其二是:当ij时,说明经过第s步,尚未走到楼下,尚需再试第s+1步的走法,注意这时站在第i-j级台阶上。因此要调用try(i-j,s+1)。 #include stdio.h // 预编译命令 int take[11]; // 定义全局变量:数组take,方案数num int num = 0; void try(int i, int s) // 被调用函数 { int j,k; // 定义整型变量j表示每步允许走的台阶数, // k临时变量 for (j = 3; j 0; j = j - 1) // 循环 { // 循环体开始 if (i j) // 如果所剩台阶数小于允许走的台阶数j, { // 什么也不做 } // else …… else // 以下是i=j的情况 { take[s] = j; // 记录第s步走j个台阶 if (i==j) // 如果已经到了楼下,做下列事情 { num = num + 1; // 方案数加1 printf(方案%d : ,num); // 输出方案数 for (k=1; k=s; k=k+1) // 输出本方案的每一步 { // 所走的台阶数 printf(%d ,take[k]); } printf(\n); // 换行 } else // 尚未走到楼下 { try(i-j, s+1); // 再试剩下的台阶(递归调用) } } } // 循环体结束 } // 函数体结束 void main() // 主函数 { int h; // 定义整型变量h是楼梯的台阶数 printf(“请输入楼梯的台阶数:); // 提示信息 scanf(%d,h); // 输入楼梯的台阶数 try(h,1); // 调用函数try(h,1) printf(总方案数:%d\n,num); // 输出总方案数 } 八皇后问题 在8×8的棋盘上,放置8个皇后(棋子),使两两之间互不攻击。所谓互不攻击是说任何两个皇后都要满足: (1)不在棋盘的同一行; (2)不在棋盘的同一列; (3)不在棋盘的同一对角线上。 因此可以推论出,棋盘共有8行,每行有且仅有一个皇后,故至多有8个皇后。这8个皇后每个应该放在哪一列上是解该题的任务。我们还是用试探的方法“向前走,碰壁回头”的策略。这就是“回溯法”的解题思路。
原创力文档


文档评论(0)