为啥这个递归会崩溃?

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)...; 替换它可以解决问题。

【讨论】:

以上是关于为啥这个递归会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 Ext.grid.Panel 会崩溃?

为啥这个程序会崩溃? [关闭]

为啥这个检查代理有效性的代码会崩溃?

为啥这个程序会崩溃:在 DLL 之间传递 std::string

为啥这个 C 程序会崩溃?它编译得很好[重复]

为啥这个自定义指针类会崩溃?