2013-03-19 84 views
0

我正在写一个Sudoku求解器,并且我有解决函数的工作。递归。 return func()和if(func())返回true有什么区别?

bool Sudoku::solve(int row, int col){ 
    while (board[row][col] != 0){ 
     col++; 

     if (col > 8){ 
      col = 0; 
      row ++; 
     } 

     if (row > 8){ 
      return true; 
     } 
    } 

    for (int number = 1; number <= 9; number++){ 
     board[row][col] = number; 

     if (check_row(row,number) && check_col(col,number) && check_box(row,col,number)){ 
      int next_row = row; 
      int next_col = col; 

      next_col++; 

      if (next_col > 8){ 
       next_col = 0; 
       next_row++; 
      } 

      if (next_row > 8) 
       return true; 


      // return solve(next_row, next_col); 
      if (solve(next_row, next_col)) 
       return true; 
     } 
    } 

    board[row][col] = 0; 
    return false; 
} 

我不能真正理解什么是

if (solve(next_row, next_col)) 
    return true; 

return solve(next_row, next_col); 

但与第二线我的函数没有按'之间的区别;科技工作

+4

第二个总是返回一些东西。如果条件错误,第一个继续。 – chris 2013-03-19 18:43:07

回答

2

如果solve(next_row, next_col)为假,则首先会继续执行功能。第二个将会返回false。

0

solve(next_row, next_col)返回一个布尔值,if(solve...)检查它的返回值并决定返回tr如果问题解决了。

在递归你需要一个条件来阻止它:

 if (solve(next_row, next_col)) 
      return true; 

会找到解决方案后停止solve

0

使用if (solve(next_row, next_col)) return true;如果为false,则执行继续到下一行。如果返回值仅为true,则返回。这意味着如果第一个条件为false,而第二个条件为false,则将执行board[row][col] = 0;

0

在一般情况下,存在

的两个差异,如果(解决())返回true;

返回解决();

第一个区别是,如果来自solve的返回值评估为true,则该函数将继续而不是退出。第二个区别是在第二行中,solve()不必返回truefalse,但可能返回非零值而不是true(如果solve()函数未返回值bool)。

0

第一种情况:

if (solve(next_row, next_col)) 
    return true; 

在这种情况下,它在解决函数返回true,永不返回false返回true。

第二种情况:

return solve(next_row, next_col); 

它返回true,如果solve返回true,否则返回false。

相关问题