数组元素打印的递归方法

时间:2018-10-30 14:33:09

标签: c++ arrays recursion return

我正在学习递归调用的实现。我被return语句卡住了,我试图通过递归调用来打印数组元素。虽然我可以打印,但是我想退回,可以帮助身体

#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 :(得分:3)

如Nathan所说,您不需要退回任何东西。看看下面的代码,因为我认为您已经了解了递归的主要思想,所以对您的代码进行了一些修改:

#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;
}

在每个调用中,将打印一个元素,并在遍历数组后返回。请注意,return的末尾有一个隐式recursive_arr_traversal

答案 1 :(得分:2)

(基本)递归函数应该包含两个部分:基本情况,其中所有工作已经完成或几乎完成,而我们要做的就是清理并返回;以及递归情况,其中我们需要做一小部分工作,然后将其余的工作传递给恢复功能。

这里的基本情况非​​常简单,您已经正确了。 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);
}

答案 2 :(得分:1)

如果您要返回所有值以像main()这样的函数使用,以便您可以永久访问数组值,那么仅返回递归函数是不可能的。就像上面其他人所说的那样,当您返回一个值时,该值将返回给调用它的函数(如果需要,请绘制一个调用栈)。

如果仅创建一个全局变量以保存所需的值,则可以解决您的需求。