【发布时间】: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 等等。