Проблема с рекурсивным объектным методом c-void - PullRequest
1 голос
/ 13 марта 2011

это мой первый вопрос здесь, и я надеюсь, что кто-то может мне помочь. Я новичок в программировании iPhone и хочу попробовать простое приложение ... Это SudokuSolver, который работает с рекурсивным методом. В JAVA этот код не создает проблем, но в Objective-C код не останавливается, когда судоку решается. Он все еще пытается решить судоку и останавливается позже.

У кого-нибудь есть идеи?!

Вот код.

- (SudokuSolver *) initWithField: (int[9][9]) field {
self = [super init];
if(self) {
    for (int i=0; i<9; i++) {
        for (int j=0; j<9; j++) {
            sudokuField[i][j] = field[i][j];
            if (field[i][j]) {
                sudokuFieldStatic[i][j] = 1;
            } else {
                sudokuFieldStatic[i][j] = 0;
            }
        }
    }
}
return self;
}

- (void) solve {
   [self solveFieldAtRow:0 andCol:0];
}

- (void) solveFieldAtRow: (int) row andCol: (int) col {
  if (row > 8) {
    return;
  } else {
    while (sudokuField[row][col] != 0) {
        if (++col > 8) {
            col = 0;
            row++;
            if (row > 8) {
                return;
            }
        }
    }
    for (int num=1; num<10; num++) {
        if ([self checkRow:row forNumber:num] && [self checkCol:col forNumber:num] && [self checkFieldAtRow:row andCol:col forNumber:num]) {
            sudokuField[row][col] = num;
            [self showFieldInConsole:0];
            if (col < 8) {
                [self solveFieldAtRow:row andCol:col+1];
            } else {
                [self solveFieldAtRow:row+1 andCol:0];
            }
        }
    }
    sudokuField[row][col] = 0;
  }
}

1 Ответ

0 голосов
/ 13 марта 2011

Код не останавливается, когда головоломка решается, потому что вы не проверяете, решена ли головоломка после рекурсивного вызова.Таким образом, даже если рекурсивный вызов нашел решение, код продолжает работать даже после нахождения решения, пока не попробует каждую возможность.

Поскольку вы говорите, что у вас работает Java-код, я предлагаю вам сравнить логикуJava-программа против этого кода.Вы, вероятно, обнаружите, что в Java-коде есть такой тест.


Редактировать Из вашего комментария выше я вижу, что вы не найдете такого теста в своем Java-коде.потому что там вы злоупотребляете исключениями для «возврата» из рекурсии, когда найдено решение.Надлежащим способом является, чтобы каждый рекурсивный вызов возвращал истинное значение, если он нашел решение, и false, если он не нашел.И затем каждый шаг должен проверять, был ли его дочерний вызов успешным, и сам возвращать успех, если это так.Как то так:

- (BOOL) solveFieldAtRow: (int) row andCol: (int) col {
    if (row > 8) {
        // reached the end, so it must have succeeded
        return YES;
    } else {
        while (sudokuField[row][col] != 0) {
            if (++col > 8) {
                col = 0;
                row++;
                if (row > 8) {
                    // reached the end, so it must have succeeded
                    return YES;
                }
            }
        }
        for (int num=1; num<10; num++) {
            if ([self checkRow:row forNumber:num] && [self checkCol:col forNumber:num] && [self checkFieldAtRow:row andCol:col forNumber:num]) {
                sudokuField[row][col] = num;
                [self showFieldInConsole:0];
                BOOL result;
                if (col < 8) {
                    result = [self solveFieldAtRow:row andCol:col+1];
                } else {
                    result = [self solveFieldAtRow:row+1 andCol:0];
                }
                if (result) {
                    // Our child call succeeded, so we pass that back up
                    // the stack.
                    return YES;
                }
            }
        }
        sudokuField[row][col] = 0;
        // If we get here, we could not find a solution. Return failure
        // back up the stack.
        return NO;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...