好玩的递归:(

copygirl 2005-05-03 11:17:24
递归其实一点也不好玩:(

这个递归函数会引起“无效命令”错误,但我实在看不出哪里出错了,请你帮我检查一下好吗?
函数功能:给出一个参数结点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;
}
}
...全文
317 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
dobear_0922 2005-05-05
  • 打赏
  • 举报
回复
楼上说得好,呵呵
pahuihui 2005-05-04
  • 打赏
  • 举报
回复
曾几何时,记得大师说过:
递归递归,切莫只递不归
astrophor 2005-05-04
  • 打赏
  • 举报
回复
难得糊涂...
copygirl 2005-05-04
  • 打赏
  • 举报
回复
可是,不是4.1,我也会自己让自己犯糊涂。。。。。。
du51 2005-05-04
  • 打赏
  • 举报
回复
呵呵.有意思.
astrophor 2005-05-04
  • 打赏
  • 举报
回复
呵呵
那是因为这几天过节
copygirl 2005-05-04
  • 打赏
  • 举报
回复
我发现最近怎么老是散分,这个贴又是散分贴,晕!
已经检查出错误了,全部代码只有大概十来行的样子,写的时候糊涂了,我怎么这样呢。。。。。。
后天上班的时候再散源代码,敬请期待(我手机上的“五连珠”游戏)。
浪费了这么多天,原来是开始时的搜索路径写错了,我要疯了
astrophor 2005-05-03
  • 打赏
  • 举报
回复
那可能是数组越界,访问非法内存什么的
单步调试看看
把代码给我,我帮你看
copygirl 2005-05-03
  • 打赏
  • 举报
回复
哦,它运行着运行着,就会自动关闭,然后出现一个对话框,里面有“无效命令”错误什么的.
astrophor 2005-05-03
  • 打赏
  • 举报
回复
我不觉得是因为递归的太深,就是一个迷宫吧,才9*9
再大也大不到哪去,我最近做的一个40*40*40的递归都可以
楼主的问题是什么?
什么叫“无效命令”错误?
不清楚,还望指教
copygirl 2005-05-03
  • 打赏
  • 举报
回复
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[][]定义为:已经检查过的格子,现在把它定义为:走不通的格子.
这段程序确实有点长,但我已经把搜索最优路径的那段去掉了,已经不能再去了:(
cpponduty 2005-05-03
  • 打赏
  • 举报
回复
也许的确是递归太深,栈空间不足,导致ret到非法地址去。。
astrophor 2005-05-03
  • 打赏
  • 举报
回复
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;
}

另;把全部代码帖出来好了,一个函数好难看...还不能调试,也不知道对不对

FireEmissary 2005-05-03
  • 打赏
  • 举报
回复
是递归太深,栈空间不足
blackmouth 2005-05-03
  • 打赏
  • 举报
回复
用递归虽然是很美妙的事情,但是有递归深度的限制,导致程序虽然在逻辑上完全正确,但是由于递归太深,程序会无故退出,而且毫无错误提示,我曾经编过一个字符处理程序就是这样,查了半天的错,最后把程序改成非递归的就没错了。所以还是慎用递归!!
根据楼主的描述,问题不是出在递归深度限制上。
astrophor 2005-05-03
  • 打赏
  • 举报
回复
不是太明白楼主的意思
Beads_checked我觉得可以用来标记已经走过的点
用回搠实现
看楼主的程序感觉是个死循环,因为可以访问以前走过的点

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧