递归调用失败

时间:2014-08-07 15:08:15

标签: c++ recursion

我正在创建一个suduko生成器,我在使用递归调用函数时遇到堆栈溢出,或者在使用类调用函数时不调用函数,我无法解释发生了什么但这是代码:

sudoku::sudoku()
{
    srand((unsigned int)time(NULL));
    generate();       // call the generate function
    display(1);
}

sudoku::~sudoku()
{}

bool sudoku::validate(){     //makes sure not more than one of the same number in row/column
    for (int x = 0; x < size; x++){
        for (int y = 0; y < size; y++){
            if (number == Array[x][y])
                return true;
        }
    }
    return false;
}

void sudoku::generate(){          // generates sudoku numbers which is 9x9 
    for (int x = 0; x < size; x++){
        for (int y = 0; y < size; y++){
            number = 1;
            if (validate() == true){
                generate();          //get a stack overflow with this call 
                                 //if I change "generate" to "sudoku generate" the
                                 //stack overflow doesn't happen but then the function 
            }                        //is not called, the if statement just skips to the else 
            else{
                Array[x][y] = number;
            }
        }
      }
   }

有没有办法调用“sudoku generate()”而if语句跳过条件即使它是真的?还是有另一种方法吗?

1 个答案:

答案 0 :(得分:0)

首先,if语句是多余的

if(validate()==true)

validate返回一个布尔值吗?为什么将此等同于另一个布尔值,您可以将其写为:

if(validate())

堆栈溢出可能是由于对generate()和validate()函数的调用过多引起的,请记住每次递归调用都会将此函数的另一个实例推送到堆栈。要解决这个问题,您可能需要了解沟通花瓶的原则:https://www.youtube.com/watch?v=q1G6S0DbnJY 或者你可以在edX上审核这个课程,它可以快速了解不变的编程和沟通花瓶的原则:https://courses.edx.org/courses/LouvainX/Louv1.01x/1T2014/info