因此,我缺乏引用和递归方面的知识。
考虑以下几点:
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[]
将正常工作。然后同时更改 main
和 sumelements
通过list
不使用operator*
根本。当您仅通过其名称引用固定长度数组时,它会衰减为指向第一个元素的指针,因此 main
可以将数组作为 list
传递自己。
另外,你有无穷无尽的递归,因为你在 sumelements
中没有停止条件。 ,所以它会不断地调用自己,导致未定义的行为一次arraylength
变成 < 0
.
另外,在 main
,您正在声明您的 list
使用 arraylength
的数组在编译时不知道的值,仅在运行时知道。 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);
}
关于c++ - 如何在递归函数中调用引用数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49439307/