рассчитать сумму всех элементов в двойном массиве - PullRequest
2 голосов
/ 21 сентября 2011

Я немного запутался в использовании массива при выполнении рекурсии, может кто-нибудь исправить мою ошибку?

новое обновление, основанное на требуемом вопросе, некоторые строки нельзя редактировать

double sum_of_array(double x[],int size)
{


    static double sum; <---can be edit

    int index = 0; <--can be edit

    if(index<size){

        return sum + sum_of_array(x,size-1); <--can be edit

    }

    else {
       something ; <--can be edit
       return sum; <--can be edit

    }
}

int main(void){

    double x[] = {4.5,5.0,6.8};

    double y[] = {4.7,3.4,2.5,5.2};

    cout<<"Sum X = "<<sum_of_array(x,3)<<endl;

    cout<<"Sum Y = "<<sum_of_array(y,4)<<endl;

    return 0;
}

вывод:

Sum of the element in X[]=15.3

Sum of the element in Y[]= 15.8

Ответы [ 12 ]

6 голосов
/ 21 сентября 2011

Вы пытаетесь создать что-то чрезвычайно сверхмощное.Вам нужны две вещи - крайний случай (отсечение рекурсии) и общий случай (спуск в рекурсии).В вашем случае крайний случай - «размер массива равен нулю», а общий случай - «захватить первый элемент и передать остаток массива в рекурсию».

Это может быть что-то вроде этого:

double sum_of_array( double x[], int size )
{
    if( size == 0 ) { //this is the edge case
        return 0;
    }

    // here you grab the first element and pass the rest of array into a recursive call
    return x[0] + sum_of_array( x + 1, size - 1 );
}
2 голосов
/ 21 сентября 2011

Логика вашей рекурсивной функции просто неверна. Вы никогда не читаете содержимое массива. Я удивлен, что вы получили какой-либо значимый вывод из этого.

Вам необходимо переосмыслить рекурсивное определение, чтобы выполнить это добавление.

Базовый корпус (ы):
Сумма пустого массива 0..
т.е. sum_of_array(x, 0) == 0.

Сумма массива из 1 элемента - это значение элемента.
т.е. sum_of_array(x, 1) == x[0]

Рекурсивный случай:
Сумма массива из n элементов - это сумма n-го элемента и сумма первых n-1 элементов.
т.е. sum_of_array(x, n) == x[n-1] + sum_of_array(x, n-1)

Выясните, как закодировать эту логику в вашей функции.

2 голосов
/ 21 сентября 2011

В этом коде довольно много ошибок:

  • Во-первых, постоянная сумма кажется бесполезной. Для чего когда-либо используется?
  • Во-вторых, вы никогда не берете содержимое x в своей функции.
1 голос
/ 21 сентября 2011

Проблема в том, что вы используете статическую переменную sum вместо x[size - 1].Показ того, как это исправить, в данный момент является излишним (7 ответов уже делают это).Однако это можно сделать в одну строку с помощью встроенных в C ++ возможностей:

#include <algorithm>
double sum_of_array(double x[], int size)
{
    return std::accumulate(x, x + size, 0.);
}
1 голос
/ 21 сентября 2011

На самом деле вы никогда не добавляете значения в x[] и y[] к sum, кроме того, index всегда равно 0. Возможно, вам следует передать его в качестве другого параметра функции:

double sum_of_array(double x[], int size, int index)
{
    if(index<size){
        return x[index] + sum_of_array(x, size, index+1); 
    }
    else {
        return 0;
    }
}

Вам на самом деле не нужна переменная sum.

0 голосов
/ 02 января 2017

Я надеюсь, что смогу ответить своим ответом. Самый последний ответ, исключая мой, относится к 2011 году.

Это еще одно решение для расчета суммы всех элементов в массиве.

double array_sum(double *p_array, int idx_low, int idx_high){
   if(idx_low == idx_high)
      return p_array[idx_low];
   int idx_mid=idx_low+(idx_high-idx_low)/2;
   return array_sum(p_array,idx_low,idx_mid)+array_sum(idx_mid+1, idx_high);
}

Анализ этого алгоритма даст время выполнения O(n*log(n)). Тем не менее, было бы разумно принять это заявление с щепоткой соли.

0 голосов
/ 18 февраля 2016

Вот как я это сделал:

double sum_of_array(double x[], int size)
{
    if(size == 0){
        return 0;
    }

    else{
        return x[--size] + sum_of_array(x, size);
   }

}
0 голосов
/ 21 сентября 2011

ОК, последняя попытка:

double sum_of_array(double x[], int index, int size)
{
    if(index < size){
        return x[index] + sum_of_array(x, index + 1, size);
    }
    else {
        return 0;
    }

}

, затем

cout<<"Sum X = "<<sum_of_array(x,0,3)<<endl;
0 голосов
/ 21 сентября 2011

Хорошо, тогда это должно быть так:

double sum_of_array(double x[],int index)
{
    int size = sizeof( x) / sizeof( x[0] );
    if(index<size){
        return x[index] + sum_of_array(x, index + 1);
    }
    return 0;

}

, затем позвоните

sum_of_array(x,0);

То есть вы всегда звоните в первый раз с индексом 0

0 голосов
/ 21 сентября 2011
double sum_of_array(double x[],int size)
{
    size = size - 1;
    if(size < 0){
        return 0; 
    }
    return x[size] + sum_of_array(x, size);
}
...