为啥这个递归会崩溃?
Posted
技术标签:
【中文标题】为啥这个递归会崩溃?【英文标题】:Why does this recursion crash?为什么这个递归会崩溃? 【发布时间】:2022-01-13 18:36:01 【问题描述】:我想在矩阵中生成 0-4 之间的随机数,check(x) 检查您是否允许分配 x 到那个位置,如果不是,那么 -3 被分配。 底部的while循环使我的代码崩溃,有什么解决方法吗?
int Creat(int T[7][7],int i,int j)
int x=rand()%5;
switch(j)
case 0: case 6:
if(i==0||i==6)
if(T[i-1][j]==0||T[i][j-1]==0)
T[i][j]=(check(1))?1:-3;
else
T[i][j]=(check(x%2))?x%2:-3;
else
if(T[i-1][j]==0||T[i][j-1]==0)
T[i][j]=(check(x%2+1))?x%2+1:-3;
else
T[i][j]=(check(x%3))?x%3:-3;
break;
case 1:case 2:case 3:case 4:case 5:
if(i==0||i==6)
if(T[i-1][j]==0||T[i][j-1]==0)
T[i][j]=(check(x%2+1))?x%2+1:-3;
else
T[i][j]=(check(x%3))?x%3:-3;
else
if(T[i-1][j]==0||T[i][j-1]==0)
T[i][j]=(check(x%4+1))?x%4+1:-3;
else
T[i][j]=(check(x))?x:-3;
break;
default: return rand()%5;
while(T[i][j]==-3)T[i][j]=Creat(T,i,j);
return T[i][j];
【问题讨论】:
while 循环不是有条件的。也就是说,每次调用该函数时它都会运行,然后再次调用该函数。看到这个地方的名字了吗? “所以” - 这就是你得到的。你只会越来越深入递归——Creat
的任何调用都没有完成......
@enhzflep 如果它生成正确的数字,它可能会停止,尽管我从你所说的情况中得知这是糟糕的编码,没有错。可能会停止,但速度不够快,不会崩溃。
抱歉,请在代码中包含换行符和空格。如图所示,它几乎不可读! while(T[i][j]==-3)T[i][j]=Creat(T,i,j);
行实际上在 switch
语句的右大括号之后包含一个独立的 while
循环。
在我看来,您可以修改check()
或将其包装,这样您就不会在此函数中编写三元运算符。例如,您只需使用T[i][j] = revised_check(x % 4 + 1, -3);
,如果正常则返回第一个参数,否则返回第二个参数。这将降低这段代码的复杂性。
我的目标是摆脱 -3s (suitable num not found) ,代码无需递归即可正常工作,但我在我的矩阵中有 -3,check()
防止超出 ex(0s 的限制为 9 1 的数字限制s 是 17 等等。
【参考方案1】:
谢谢@jonathan Leffler,@enhzflep while 循环是独立的。
用if(T[i][j]==-3)...;
替换它可以解决问题。
【讨论】:
以上是关于为啥这个递归会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章