我正在学习递归调用的实现。我被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;
}
答案 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()
这样的函数使用,以便您可以永久访问数组值,那么仅返回递归函数是不可能的。就像上面其他人所说的那样,当您返回一个值时,该值将返回给调用它的函数(如果需要,请绘制一个调用栈)。
如果仅创建一个全局变量以保存所需的值,则可以解决您的需求。