Нюансы 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;
}