请教一个函数里的问题

jinnsky 2006-03-08 12:10:46
void TryPut(int index,int num)
{
int i,j;
if(index>n*n)
{
if(num>nCount)
{
nCount=num;
return;
}
}
else
{
i=index/n;
j=index%n;
if(a[i][j]=='.' && CanPut(i,j)) /*IF*/
{
a[i][j]='T';
TryPut(index+1,num+1); /*A*/
a[i][j]='.'; /*B*/
}
TryPut(index+1,num); /*C*/
}
}

请问在这个函数里,如果IF句成立执行到A进行递归,,如果IF句不成立则执行C进行递归,那么中间的B什么时候执行,也就是B句中i、j怎么取值?我把B句去掉后的输出结果变了,但总想不通B句的作用,希望高人指教,不胜感激!
...全文
150 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinnsky 2006-03-09
  • 打赏
  • 举报
回复
想了一天终于搞懂了,谢谢各位的解答^_^
bo.cui 2006-03-08
  • 打赏
  • 举报
回复
A返回后执行B 然后在去递归C 然后在A 返回后执行B 在C.....
qybao 2006-03-08
  • 打赏
  • 举报
回复
a[i][j]='T'; //首先,你明白这里了吗?这里设置标志,为了防止递归里被重复执行
TryPut(index+1,num+1); /*A*/
a[i][j]='.'; /*B*/ //那么执行完递归后,就要把原来的值恢复回来

我是这么理解的
B句的i,j取值跟i=index/n;j=index%n;是一样的

jixingzhong 2006-03-08
  • 打赏
  • 举报
回复
楼主需要了解下 递归的 流程 ...

递归,
需要保存现场信息,
为的就是在函数调用返回之后继续后面的语句,
而不是说,
递归了,
下面的语句就直接被忽略了 ...
jixingzhong 2006-03-08
  • 打赏
  • 举报
回复
我把B句去掉后的输出结果变了
--------------
晕 !

递归又不是说下面的语句不执行了啊 ~
递归返回之后,
B 语句不是还要执行的么 !!

你把它去掉了,就是说这个语句不执行了
但是原来它是要执行,
结果怎么还会一样 ?
yzx1983 2006-03-08
  • 打赏
  • 举报
回复
递归函数的每个执行体也总是要返回的啊,当a处的执行体返回后就执行到b了。

69,336

社区成员

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

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