рекурсивный метод для печати элементов массива - PullRequest
0 голосов
/ 30 октября 2018

Я изучаю реализацию рекурсивных вызовов. Я застрял с инструкциями возврата, я пытаюсь распечатать элементы массива с помощью рекурсивного вызова. хотя я печатаю, но это, но я хочу вернуть его, может ли тело помочь

#include<iostream>
using namespace std;

int recursive_arr_traversal(int *arr, int length_of_array) {

    if (length_of_array <= 0) {
        return 0;
    }
    else {
        return *arr; //this statement prints only one array element<endl
        cout << *arr << endl;//this works fine 
    }

    return recursive_arr_traversal(arr + 1, length_of_array - 1);

}


int main() {
    int arr[10] = { 1,2,3,4,56,7,8,9,99,0 };
    int length_of_array = 10;
    //recursive_arr_traversal(arr,length_of_array);
    cout << recursive_arr_traversal(arr, length_of_array);
    return 0;
}

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

(базовая) рекурсивная функция должна состоять из двух частей - базового случая, где вся работа уже выполнена или почти выполнена, и все, что нам нужно сделать, это очистить и вернуть, и рекурсивного случая, где нам нужно выполнить небольшую часть работы, а затем передать остальную часть функции рекуссии.

Базовый случай здесь довольно прост, и вы уже поняли это правильно. if(length <= 0), все, что у нас осталось, это пустой массив, поэтому мы можем просто вернуться и закончить. Больше нет работы.

Рекурсивный случай немного сложнее, и он у вас почти есть!

В нашем рекурсивном случае в этой задаче должен быть напечатан первый элемент, а затем передан массив, который на один короче и запускается на один элемент позже. Также обратите внимание, что вы никогда не используете возвращаемое значение, и, поскольку это функция печати, она, вероятно, должна быть void. С этими исправлениями код может выглядеть следующим образом:

int arr_print(int *arr,int len){
   //base case: if arr is empty, we're done
   if(len <= 0) { return; }

   //recursive case: print first element, then pass array along to print rest
   cout << *arr << endl;
   arr_print(arr + 1, len - 1);
}
0 голосов
/ 30 октября 2018

Если вы говорите, что хотите вернуть все значения, чтобы они работали, как main(), чтобы у вас был постоянный доступ к значениям вашего массива, это невозможно сделать, просто вернувшись в рекурсивную функцию. Как уже говорилось выше, когда вы возвращаете значение, это значение возвращается в функцию, которая его вызвала (нарисуйте стэк вызовов, если вам нужно).

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

0 голосов
/ 30 октября 2018

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

#include<iostream>
using namespace std;

void recursive_arr_traversal(int *arr, int length_of_array) {

    if (length_of_array <= 0) return;

    cout << *arr << endl;//this works fine 
    recursive_arr_traversal(arr + 1, length_of_array - 1);
}


int main() {
    int arr[10] = { 1,2,3,4,56,7,8,9,99,0 };
    const int length_of_array = 10;
    //recursive_arr_traversal(arr,length_of_array);
    recursive_arr_traversal(arr, length_of_array);
    return 0;
}

В каждом вызове печатается один элемент, и он возвращается после того, как вы прошли массив. Обратите внимание, что в конце recursive_arr_traversal.

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