Получение странных значений переменной при использовании рекурсии - PullRequest
0 голосов
/ 29 октября 2018

Я написал программу для вывода суммы первых 25 натуральных чисел с использованием рекурсивной функции. Все прошло хорошо, и я также получил правильный вывод (т.е. 325). После этого я немного поиграл со своим кодом, чтобы посмотреть, что произойдет.

Вот код:

int su(int sum,int i)
{
    if(i<26)
    {
        sum=sum+i+su(sum,i+1);
        cout << sum << endl;   // I added this line to see what happens.
                               // This line wasn't needed but I still
                               // added it.
    }
    else
    return sum;
}

Когда я запустил этот код, он напечатал странные значения переменной sum. Вот скриншот вывода: вывод Сумма первых 25 натуральных чисел равна 325, но это даже не отображается нигде в выводе. Вместо этого я получил разные цифры, как в моем выводе. Однако когда я удаляю строку cout << sum << endl; из оператора if, я получаю ожидаемую сумму (т. Е. 325).
В чем причина этого?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Ваша не пустая функция ничего не возвращает, если 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
0 голосов
/ 29 октября 2018

Ваша функция не возвращает ничего, если не в конце рекурсии. Удалите ключевое слово else, оно должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...