递归法及回溯法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
递归法及回溯法

?递归法和回溯法有人说,回溯实际上是递归的展开,但实际上。两者的指导思想并不一致。打个比方吧,递归法好比是一个军队要通过一个迷宫,到了第一个分岔口,有3条路,将军命令3个小队分别去探哪条路能到出口,3个小队沿着3条路分别前进,各自到达了路上的下一个分岔口,于是小队长再分派人手各自去探路——只要人手足够(对照而言,就是计算机的堆栈足够),最后必将有人找到出口,从这人开始只要层层上报直属领导,最后,将军将得到一条通路。所不同的是,计算机的递归法是把这个并行过程串行化了。而回溯法则是一个人走迷宫的思维模拟——他只能寄希望于自己的记忆力,如果他没有办法在分岔口留下标记(电视里一演到什么迷宫寻宝,总有恶人去改好人的标记)。想到这里突然有点明白为什么都喜欢递归了,他能够满足人心最底层的虚荣——难道你不觉得使用递归就象那个分派士兵的将军吗?想想汉诺塔的解法,也有这个倾向,“你们把上面的N-1个拿走,我就能把下面的挪过去,然后你们在把那N-1个搬过来”。笑谈,切勿当真。这两种方法的例程,我不给出了,网上很多。我只想对书上的递归解法发表点看法,因为书上的解法有偷梁换柱的嫌疑——迷宫的储存不是用的二维数组,居然直接用岔路口之间的连接表示的——简直是人为的降低了问题的难度。实际上,如果把迷宫抽象成(岔路口)点的连接,迷宫就变成了一个“图”,求解入口到出口的路线,完全可以用图的遍历算法来解决,只要从入口DFS到出口就可以了;然而,从二维数组表示的迷宫转化为图是个很复杂的过程。并且这种转化,实际上就是没走迷宫之前就知道了迷宫的结构,显然是不合理的。对此,我只能说这是为了递归而递归,然后还自己给自己开绿灯。但迷宫并不是只能用上面的方法来走,前提是,迷宫只要走出去就可以了,不需要找出一条可能上的最短路线——确实,迷宫只是前进中的障碍,一旦走通了,没人走第二遍。下面的方法是一位游戏玩家提出来的,既不需要递归,也不需要栈来回溯——玩游戏还是有收获的。另一种解法请注意我在迷宫中用粗线描出的路线,实际上,在迷宫中,只要从入口始终沿着一边的墙走,就一定能走到出口,那位玩家称之为“靠一边走”——如果你不把迷宫的通路看成一条线,而是一个有面积的图形,很快你就知道为什么。编程实现起来也很简单。下面的程序在TC2中编译,不能在VC6中编译——为了动态的表现人的移动情况,使用了gotoxy(),VC6是没有这个函数的,而且堆砌迷宫的219号字符是不能在使用中文页码的操作系统的32位的console程序显示出来的。如果要在VC6中实现gotoxy()的功能还得用API,为了一个简单的程序没有必要,所以,就用TC2写了,突然换到C语言还有点不适应。#include stdio.htypedef struct hero {int x,y,face;} HERO;void set_hero(HERO* h,int x,int y,int face){h-x=x;h-y=y;h-face=face;}void go(HERO* h){if(h-face%2) h-x+=2-h-face;else h-y+=h-face-1;}void goleft(HERO* h){if(h-face%2) h-y+=h-face-2;else h-x+=h-face-1;}void turnleft(HERO* h){h-face=(h-face+3)%4;}void turnright(HERO* h){h-face=(h-face+1)%4;}void print_hero(HERO* h, int b){?? gotoxy(h-x + 1, h-y + 1);?? if (b)?? {?????? switch (h-face)?????? {?????? case 0: printf(%c, 24); break;?????? case 1: printf(%c, 16); break;?????? case 2: printf(%c, 25); break;?????? case 3: printf(%c, 27); break;?????? default: break;?????? }?? }?? else printf( );}int maze[10][10] ={?? 0, 0, 0, 1, 0, 0, 0, 1, 0, 0,?? 1, 0, 1, 1, 0, 1, 1, 1, 1, 0,?? 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,?? 0, 0, 1, 0, 1, 1, 0, 1, 1, 1,?? 0, 0, 1, 0, 1, 1, 0, 0, 0, 1,?? 1, 0, 1, 0, 1, 1, 0, 1, 0, 1,?? 0, 0, 1, 0, 1, 1,

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档