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

时间:2018-03-22 22:13:02

标签: c++ recursion syntax reference

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

请考虑以下事项:

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行会导致错误,因为我的语法错误,但我说我不熟悉这两个概念。

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

2 个答案:

答案 0 :(得分:3)

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

此外,你有无尽的递归,因为你在sumelements没有停止条件,所以它会一直无休止地调用自己,导致未定义的行为一次{{1} }变成arraylength

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

试试这个:

const

Live Demo

话虽这么说,更多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);
}

Live Demo

答案 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>

如上所述:这只是为了理解,不要这样做,像雷米一样使用指针!