首页 > 解决方案 > 使用递归对数组的正元素求和

问题描述

我正在学习递归并尝试计算数组的正元素的总和,但我不知道该怎么做。谁能帮我?

#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++arraysc++11recursionsum

解决方案


您的递归函数应返回以下三个值之一:

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

在每次递归调用中,我们需要: (a) 增加“当前”元素的索引;(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!
}

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


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


推荐阅读