使用递归求和数组的正元素

Sum the positive elements of an array using recursion

本文关键字:元素 数组 求和 递归      更新时间:2024-09-26

我正在学习递归,并试图计算数组的正元素之和,但我不知道如何做到。有人能帮我吗?

#include <iostream>
using namespace std;

int sum (int arr[],int n)
{
if(n==-1)
return  0;
/*else if(arr[n]<0)
return arr[n]+sum(arr,n+1) ;*/
else
return arr[n-1]+sum(arr , n-1);

}

int main()
{
int  n , arr[n] ;
cout<<"give the value of  n : " ; cin>>n;
cout<<"give the values of the array ";
for(int i=0;i<n;i++)
cin>>arr[i];
cout<<"the value of positive elements is  : " << sum(arr,n);
return 0;
}

一些建议:

C++中的
  1. (特别是从C++11开始(尽可能避免使用旧的C样式数组;改为使用std::vectorstd::dequestd::array(从C++11开始(;

  2. 在可能的情况下,使用模板编写通用代码;在这种情况下,避免使用仅适用于C样式数组的sum()函数,而是编写一个也适用于std::vector等的模板函数。

  3. 管理大小时,请使用无符号整数(例如std::size_t(,而不是有符号整数;这与标准C++库一致,并避免了许多有符号/无符号的不一致。

假设您正在学习递归,我提出以下sum()函数

template <typename T>
int sum (T const & arr, std::size_t n)
{
return   ( arr[n] > 0 ? arr[n]        : 0)
+ (      n > 0 ? sum(arr, n-1) : 0);
}

观察第一行,其中

( arr[n] > 0 ? arr[n]        : 0)

arr[n]被加到和iff(当且仅当(大于零(否则被加到零(

同时观察第二行,其中

+ (      n > 0 ? sum(arr, n-1) : 0);

如果CCD_ 10大于零,则递归继续(添加CCD_。

以下是使用std::vector的完整编译示例。

#include <vector>
#include <iostream>
template <typename T>
int sum (T const & arr, std::size_t n)
{
return   ( arr[n] > 0 ? arr[n]        : 0)
+ (      n > 0 ? sum(arr, n-1) : 0);
}
int main()
{
std::size_t      dim;
std::vector<int> vec;
std::cout << "give the value of  n : " ; std::cin >> dim;
std::cout << "give the values of the array ";
vec.resize(dim);
for ( auto & val : vec )
std::cin >> val;

std::cout << "the value of positive elements is  : " 
<< (dim > 0u ? sum(vec, dim-1u) : 0) << std::endl;
}

递归函数应该返回三个值之一:

  1. 如果我们已经到达数组的末尾,则返回零
  2. 否则,如果"current"数组元素为负数或零,则返回"next"递归
  3. 否则,如果"current"元素为正,则返回该元素和下一个递归的

在每次递归调用中,我们需要:(a(增加"current"元素的索引;以及(b(减少阵列中剩余的元素的数量。对于(a(,我们可以利用这样一个事实,即作为函数参数传递的数组衰变为指向其第一个元素的指针,因此我们可以在递归调用的指针上添加一个:

int sum(int arr[], int n)
{
if (n <= 0) return 0; // Reached the end of the array: return zero
if (*arr <= 0) return sum(arr + 1, n - 1); // Non-positive number: skip it
return sum(arr + 1, n - 1) + *arr;  // Add this number to the recursion result!
}

请随时要求任何进一步的澄清和/或解释。


EDIT:此外,如果您坚持使用可变长度数组(VLA-不是标准C++(,则需要在读取用户给定的n的值后声明int arr[n]。但我建议使用固定(最大(大小,如:int n, arr[100];

。。。学习递归并尝试计算数组的正元素之和。。。

考虑如果数组中只有一个元素,该怎么办,然后编写相应的代码
return (arr[0] > 0) ? arr[0] : 0;

否则,将问题分解为一个子问题。

其他人已经回答了如何,但使用递归是一种迭代方式——只减少数组大小。递归深度可以是O(n)

我建议把问题的大小除以二
此备选方案使用的深度要小得多:O(log n)

int sum (const int arr[], int n) {
if (n <= 1) {
return (n > 0 && arr[0] > 0) ? arr[0] : 0;
}
int left_size = n/2;
return sum(arr, left_size) + sum(arr + left_size, n - left_size);
}