Ваша не пустая функция ничего не возвращает, если i
меньше 26, и это неопределенное поведение. Если вы проверили / включили предупреждения компилятора, вы увидите предупреждение:
warning: control reaches end of non-void function [-Wreturn-type]
}
^
Удаление и без того бессмысленных else
исправлений этой проблемы:
#include <iostream>
using namespace std;
int su(int sum,int i)
{
if(i<26)
{
sum=sum+i+su(sum,i+1);
cout<<sum<<endl;
}
// Removed the else. Always returns something
return sum;
}
int main() {
std::cout << su(0, 0) <<std::endl;
}
Выход:
25
49
72
94
115
135
154
172
189
205
220
234
247
259
270
280
289
297
304
310
315
319
322
324
325
325
325
Всегда во-первых убедитесь, что ваша рекурсивная функция в конечном итоге выходит из цикла и возвращает значение в случае, если оно не void
. Гораздо проще и понятнее (немного похоже на классическую факториальную функцию):
#include <iostream>
int sum (int i) {
if(i == 1) {
return 1;
}
return i + sum(i-1);
}
int main() {
std::cout << sum(25) <<std::endl;
}
Выход:
325
Если вы добавите std::cout
, чтобы увидеть, что происходит под капотом:
#include <iostream>
int sum (int i) {
std::cout << i << std::endl; // current integer
if(i == 1) {
return 1;
}
return i + sum(i-1);
}
int main() {
std::cout << sum(25) <<std::endl;
}
Выходная информация соответствует ожидаемой:
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
325