所以,我的知识缺乏引用和递归。
请考虑以下事项:
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行会导致错误,因为我的语法错误,但我说我不熟悉这两个概念。
另外,我知道这是一个循环,我只是想编译它。
答案 0 :(得分:3)
sumelements
正在访问list
的特定元素,因此您需要将list
参数从int&
更改为int*
(或list[]
},在函数参数中使用时与int*
相同,以便operator[]
正常工作。然后更改main
和sumelements
以传递list
,而不使用operator*
。当你通过名称引用一个固定长度的数组时,它会衰减成指向第一个元素的指针,因此main
可以将数组本身传递为list
。
此外,你有无尽的递归,因为你在sumelements
没有停止条件,所以它会一直无休止地调用自己,导致未定义的行为一次{{1} }变成arraylength
。
此外,在< 0
中,您使用main
值声明您的list
数组,该值在编译时是未知的,仅在运行时。 C ++标准不允许以这种方式声明固定长度的数组,但是一些编译器(特别是gcc)支持它作为编译器扩展。不要依赖这种行为,因为它不可移植。将arraylength
声明为arrayLength
,以便在编译时知道。
试试这个:
const
话虽这么说,更多C ++ - 处理这个问题的方法是使用标准std::accumulate()
算法而不是递归函数:
#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);
}
答案 1 :(得分:0)
这只是在玩,可能有助于理解参考文献,但 不 旨在实际用于实际代码!!!
可以完成引用,如果一个人做对了:
int sumelements(int arraylength, int& list)
{
if(arraylength < 0) // stolen from Remy...
return 0;
return (&list)[arraylength] + sumelements(arraylength - 1, list);
// ^^^^^^^
}
好吧,因为list
仍然引用数组中的第一个整数,通过获取它的地址,您将获得所需的指针 - 然后可以使用偏移量(索引)。在递归调用中,您按原样传递list
,并再次传递。{/ p>
如上所述:这只是为了理解,不要这样做,像雷米一样使用指针!