如何在递归函数中调用引用数组?

How do you call a reference array in a recursive function?

本文关键字:引用 数组 调用 递归函数      更新时间:2023-10-16

所以,我对引用和递归都缺乏知识。

请考虑以下事项:

int sumelements(int arraylength, int &list){
return list[arraylength] + sumelements(arraylength - 1, *list);
}
int main(){
int arraylength = 10;
int list[arraylength] = {1,2,3,4,5,6,7,8,9,10};
sumelements(arraylength-1, *list);
}

第 2 行会导致错误,假设是因为我的语法错误,尽管就像我说的那样,我对这两个概念都很陌生。

另外,我知道这是一个循环,我只是想编译它。

sumelements正在访问list的特定元素,因此您需要将list参数从int&更改为int*(或list[],这与在函数参数中使用时int*相同),以便operator[]正常工作。 然后更改mainsumelements以在不使用operator*的情况下传递list。 当您仅通过名称引用固定长度数组时,它会衰减为指向第一个元素的指针,因此main可以仅将数组作为list本身传递。

此外,你有无休止的递归,因为你在sumelements中没有停止条件,所以它只会无休止地调用自己,一旦arraylength变得< 0,就会导致未定义的行为

此外,在main中,您将使用在编译时未知的arraylength值声明您的list数组,该值仅在运行时未知。 C++标准不允许以这种方式声明固定长度的数组,但一些编译器(特别是 gcc)支持将其作为编译器扩展。 不要依赖此行为,因为它不可移植。 将arrayLength声明为const,以便在编译时知道它。

试试这个:

#include <iostream>
int sumelements(int index, int *list)
{
if (index < 0) return 0;
return list[index] + sumelements(index - 1, list);
}
int main()
{
const int arraylength = 10;
int list[arraylength] = {1,2,3,4,5,6,7,8,9,10};
std::cout << sumelements(arraylength - 1, list);
}

现场演示

话虽如此,处理此问题的更C++方法是使用标准std::accumulate()算法而不是递归函数:

#include <iostream>
#include <numeric>
int main()
{
const int arraylength = 10;
int list[arraylength] = {1,2,3,4,5,6,7,8,9,10};
std::cout << std::accumulate(list, list+arraylength, 0);
}

现场演示

这只是在玩弄,可能有助于理解引用,但是,并不打算在实际代码中使用!!

如果做得对,也可以使用引用来完成:

int sumelements(int arraylength, int& list)
{
if(arraylength < 0) // stolen from Remy...
return 0;
return (&list)[arraylength] + sumelements(arraylength - 1, list);
//     ^^^^^^^ 
}

好吧,由于list仍然引用数组中的第一个整数,通过获取它的地址,您可以返回所需的指针 - 然后您可以将其与偏移量(索引)一起使用。在递归调用中,您按原样传递list,然后再次传递相同。

如前所述:这只是为了理解,不要这样做,像 Remy 那样使用指针!