Минимальное количество аргументов для рекурсивной функции для исследования матрицы - PullRequest
0 голосов
/ 18 января 2020

извините, если кто-то уже спрашивал об этом, не нашел его.

Я забочусь о том, какое минимальное количество аргументов я должен передать рекурсивной функции, чтобы изучить все ее значения.

Я приведу пример; Предположим, что я хочу написать функцию, которая возвращает мне сумму всех значений, содержащихся в матрице MXM, я, безусловно, могу сделать это (и сделал это) следующим образом:

int sum(int mat[][M], int i, int j){
if(j==M-1&&i==M-1){
    return mat[i][j];
}
if(j==M){
    i++;
    j=0;
}
return mat[i][j] + sum(mat, i, j+1);
}

Вызов

sum(mat,0,0);

Я получаю результат.

Мой вопрос: могу ли я получить тот же результат, написав функцию с меньшим количеством аргументов? О примере: могу ли я получить тот же результат, написав такую ​​функцию, как:

int sum(int mat[][M], int i){...}

или просто

int sum(int mat[][M]){...}

?

Говоря более абстрактно, каков минимум количество аргументов, которые мне нужно передать в рекурсивную функцию, чтобы исследовать матрицу?

Спасибо всем.

1 Ответ

0 голосов
/ 18 января 2020

Вы можете сделать это с одним аргументом, указав основной индекс строки для добавляемого элемента. Функция может вычислять индексы строк и столбцов на основе этого.

int sum(int mat[M][M], int x){
    int i = x / M;
    int j = x % M;
    if(j==M-1 && i==M-1){
        return mat[i][j];
    }
    return mat[i][j] + sum(mat, x+1);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...