Проблема с формулой суммы, когда я использую для l oop в основном методе - PullRequest
0 голосов
/ 10 марта 2020

это мой код для рекурсивной функции суммирования. Функция работает отлично, но когда я использую для l oop в основном методе, чтобы выдать все суммы до десяти, система перестает работать, и я не могу это объяснить. Когда я снимаю л oop, система снова в полном порядке. Я получаю следующую ошибку: Поток 1: EXC_BAD_ACCESS (код = 2, адрес

#include <iostream>
using namespace std;

int summ(int x) {
    if(x == 1)

    {
        return 1;
    }

    else {
        return summ(x - 1) + x;
    }
}

int main()
{
    int const n = 10;

    for(int i = 0; i < n; i++)

    {
        cout << summ(i) << " " << endl;
    }

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

В вашей первой итерации i = 0, что означает, что summ пропустит ваши критерии завершения (if(x == 1)). Затем он будет повторять summ(x-1) и продолжит работу до тех пор, пока стек не переполнится.

0 голосов
/ 10 марта 2020

Рекурсивная функция неправильно обрабатывает аргумент, когда он равен нулю.

Переписать функцию следующим образом

unsigned long long summ( unsigned int x ) 
{
    return x == 0 ? 0 : x + summ( x - 1 );
}

Нет смысла объявлять параметр как имеющий целочисленный тип со знаком, если вы собираетесь вычислить сумму неотрицательных чисел.

Вот демонстрационная программа

#include <iostream>

unsigned long long summ( unsigned int x ) 
{
    return x == 0 ? 0 : x + summ( x - 1 );
}

int main() 
{
    const unsigned int N = 10;

    for ( unsigned int i = 0; i < N; i++ )
    {
        std::cout << summ( i ) << ' ';
    }
    std::cout << '\n';

    return 0;
}

Вывод программы:

0 1 3 6 10 15 21 28 36 45 
...