使用递归求和数组的正元素
Sum the positive elements of an array using recursion
我正在学习递归,并试图计算数组的正元素之和,但我不知道如何做到。有人能帮我吗?
#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++中的(特别是从C++11开始(尽可能避免使用旧的C样式数组;改为使用
std::vector
、std::deque
、std::array
(从C++11开始(;在可能的情况下,使用模板编写通用代码;在这种情况下,避免使用仅适用于C样式数组的
sum()
函数,而是编写一个也适用于std::vector
等的模板函数。管理大小时,请使用无符号整数(例如
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;
}
递归函数应该返回三个值之一:
- 如果我们已经到达数组的末尾,则返回零
- 否则,如果"current"数组元素为负数或零,则返回"next"递归
- 否则,如果"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);
}
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 如何将元素添加到数组的线程安全函数?
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 输出没有重复元素的动态数组(收缩数组)C++
- 数组中最大的非重复元素
- 数组元素打印的递归方法
- 对字符数组中的元素执行逐位操作
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 如何计算数组中元素的位数?(不是数组的长度),并计算其数字的总和
- 通过交换元素使数组相同
- 按平均值替换数组中的元素
- 打印矢量数组中的所有元素
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- 如何将元素从向量转移到新数组?
- 如何在向量数组中插入元素?
- 为什么 2 个相同数组的元素彼此相等
- C++ 中的二维整数数组,每行中的元素数量不均匀