CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

好玩的递归:(

楼主copygirl(wa!)2005-05-03 11:17:24 在 C/C++ / C语言 提问

递归其实一点也不好玩:(  
   
  这个递归函数会引起“无效命令”错误,但我实在看不出哪里出错了,请你帮我检查一下好吗?  
  函数功能:给出一个参数结点find_node,搜索可以到达全局结点end_node的路径,将该路径存储在Beads_road[50][2]二维数组中.(一维就够了,但在程序其他地方需要用到第二维数据)  
  数据结构:共有9*9个方块。  
  Beads_checked[9][9],值为1时表示由此方块递归,无法到达全局结点end_node.为0时表示由此方块递归,可以到达全局结点end_node.开始时,Beads_checked[9][9]={0}  
  Beads_road[50][2],存放搜索到的路径值,例如第2行8列的方块,将其转变为一个整数:num=2*9+8%9,最后由a=num/9,b=num%9,b=b?b:9;还原行列值。  
   
  int   Beads_get_road(Beads_node   find_node)  
  {  
  int   i,j,flag=0,find_num=0;  
  Beads_node   node;  
  int   x,y;  
  int   aa[]={-1,1,0,0};  
  int   bb[]={0,0,-1,1};  
   
  for(i=0;i<4;i++)  
  {  
  node.a=find_node.a+aa[i];  
  node.b=find_node.b+bb[i];  
  if   (!(node.a>0&&node.a<10&&node.b>0&&node.b<10))  
  continue;  
  if(   (!Beads_Beads[node.a][node.b])   &&   (!Beads_checked[node.a][node.b])   )  
  {  
  if(node.a==end_node.a   &&   node.b==end_node.b)  
  {  
  j=0;  
  while(Beads_road[j][0]!=0)  
  j++;  
  Beads_road[j][0]=find_node.a*9+find_node.b%9;  
  return   1;  
  }  
  else   if(   Beads_get_road(node)   )  
  {  
   
  find_num++;  
  return   1;  
  }  
  }  
  }  
   
  if(find_num>0)  
  {  
  Beads_checked[find_node.a][find_node.b]=0;  
  j=0;  
  while(Beads_road[j][0]!=0)  
  j++;  
  Beads_road[j][0]=find_node.a*9+find_node.b%9;  
  return   1;  
  }  
  else  
  {  
  Beads_checked[find_node.a][find_node.b]=1;  
  return   0;  
  }  
  } 问题点数:50、回复次数:16Top

1 楼FireEmissary(咒火使者)回复于 2005-05-03 11:37:04 得分 5

是递归太深,栈空间不足Top

2 楼SaiRose(Learning......)回复于 2005-05-03 11:44:30 得分 20

if   (!(node.a>0&&node.a<10&&node.b>0&&node.b<10))??  
   
        if   (!(   node.a>=0   &&node.a<10&&   node.b>=0   &&node.b<10))  
   
  if(find_num>0)  
  {  
  Beads_checked[find_node.a][find_node.b]=1;   // 已经走过的  
  j=0;  
  while(Beads_road[j][0]!=0)  
  j++;  
  Beads_road[j][0]=find_node.a*9+find_node.b%9;  
  return   1;  
  }  
  else  
  {  
  Beads_checked[find_node.a][find_node.b]=0; //  
  return   0;  
  }  
   
  另;把全部代码帖出来好了,一个函数好难看...还不能调试,也不知道对不对  
   
  Top

3 楼cpponduty(饼子村村支书)(出入平安,攻德无量,万受无疆)回复于 2005-05-03 11:56:42 得分 5

也许的确是递归太深,栈空间不足,导致ret到非法地址去。。Top

4 楼copygirl(wa!)回复于 2005-05-03 11:59:08 得分 0

SaiRose(Learning......)    
  -------------------------------  
  if   (!(node.a>0&&node.a<10&&node.b>0&&node.b<10))  
  这个是边界检查,看看是否在1-9之间,因为它只是个9*9的格子.我把值定为1-9,只是为了调试方便而已,用0-8也是可以的.  
   
  我一开始将Beads_checked[][]定义为:已经检查过的格子,现在把它定义为:走不通的格子.  
  这段程序确实有点长,但我已经把搜索最优路径的那段去掉了,已经不能再去了:(Top

5 楼SaiRose(Learning......)回复于 2005-05-03 12:46:37 得分 0

我不觉得是因为递归的太深,就是一个迷宫吧,才9*9  
  再大也大不到哪去,我最近做的一个40*40*40的递归都可以  
  楼主的问题是什么?  
  什么叫“无效命令”错误?  
  不清楚,还望指教Top

6 楼copygirl(wa!)回复于 2005-05-03 12:48:56 得分 0

哦,它运行着运行着,就会自动关闭,然后出现一个对话框,里面有“无效命令”错误什么的.Top

7 楼SaiRose(Learning......)回复于 2005-05-03 12:59:12 得分 0

那可能是数组越界,访问非法内存什么的  
  单步调试看看  
  把代码给我,我帮你看Top

8 楼SaiRose(Learning......)回复于 2005-05-03 13:43:26 得分 0

不是太明白楼主的意思  
  Beads_checked我觉得可以用来标记已经走过的点  
  用回搠实现  
  看楼主的程序感觉是个死循环,因为可以访问以前走过的点Top

9 楼blackmouth(黑嘴)回复于 2005-05-03 14:58:42 得分 0

用递归虽然是很美妙的事情,但是有递归深度的限制,导致程序虽然在逻辑上完全正确,但是由于递归太深,程序会无故退出,而且毫无错误提示,我曾经编过一个字符处理程序就是这样,查了半天的错,最后把程序改成非递归的就没错了。所以还是慎用递归!!  
  根据楼主的描述,问题不是出在递归深度限制上。Top

10 楼copygirl(wa!)回复于 2005-05-04 19:18:12 得分 0

我发现最近怎么老是散分,这个贴又是散分贴,晕!  
  已经检查出错误了,全部代码只有大概十来行的样子,写的时候糊涂了,我怎么这样呢。。。。。。  
  后天上班的时候再散源代码,敬请期待(我手机上的“五连珠”游戏)。  
  浪费了这么多天,原来是开始时的搜索路径写错了,我要疯了Top

11 楼SaiRose(Learning......)回复于 2005-05-04 19:50:28 得分 5

呵呵  
  那是因为这几天过节Top

12 楼du51(郁郁思扬)回复于 2005-05-04 19:59:25 得分 5

呵呵.有意思.Top

13 楼copygirl(wa!)回复于 2005-05-04 20:21:27 得分 0

可是,不是4.1,我也会自己让自己犯糊涂。。。。。。Top

14 楼SaiRose(Learning......)回复于 2005-05-04 20:28:24 得分 0

难得糊涂...Top

15 楼pahuihui(帕灰灰)回复于 2005-05-04 21:10:48 得分 5

曾几何时,记得大师说过:  
  递归递归,切莫只递不归Top

16 楼dobear_0922(do熊)回复于 2005-05-05 12:16:18 得分 5

楼上说得好,呵呵Top

相关问题

  • 递归……
  • 递归?
  • 递归.........
  • 递归
  • 关于递归
  • 递归问题!
  • 递归调用
  • 递归函数
  • 递归问题
  • 递归问题~

关键词

  • 结点
  • 函数
  • beads
  • 递归
  • node
  • road
  • 方块
  • find
  • 路径
  • 到达全局结点

得分解答快速导航

  • 帖主:copygirl
  • FireEmissary
  • SaiRose
  • cpponduty
  • SaiRose
  • du51
  • pahuihui
  • dobear_0922

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo