Нюансы static в функциях

Как добиться приоритета для static переменной в операциях при рекурсии?

int sumOfOdds(int n)
{
    static int sum = -1; 
    if (n <= 0) {
        return 0;
    }   
    sum += 2;
    return sum + sumOfOdds(n - 1); 
}

Здесь выходит, что сначала достаётся результат из sumOfOdds(), и только затем считывается sum, но, т.к. sum изменяется при каждом вызове, считывается не то. Скобки не помогают, приходится делать что-то такое:

int _ = sum;
return _ + sumOfOdds(n - 1);

Я уверен, что это можно сделать более красиво


Ответы (3 шт):

Автор решения: Harry

Типа такого?

int sumOfOdds(int n, int sum = -1)
{
    if (n <= 0) return 0;
    sum += 2;
    return sum + sumOfOdds(n - 1, sum); 
}

или

int sumOfOdds(int n, int sum = 1)
{
    return n <= 0 ? 0 : sum + sumOfOdds(n - 1, sum+2);
}

или даже

int sumOfOdds(int n) { return (n<=0) ? 0 : 2*n-1+sumOfOdds(n-1); }

А без рекурсии, n*n - религия позволяет? :)

→ Ссылка
Автор решения: AR Hovsepyan
int sumOfOdds(int n)
{
    static int sum = 1;
    if (n > 0) {
        sum += 2;
        sumOfOdds(n - 1);
    }
    return sum;
}
→ Ссылка
Автор решения: user7860670

К чему сложности со static и рекурсией? Тут же простая арифметическая прогрессия

constexpr int sum_odds(int num)
{
    return num * (num + 1) - num;
}
→ Ссылка