#include <iostream>

using namespace std;

void print(int x)
{
    if(x==0)
        return ;
    else
    {
        print (x-1);    // statement 1
        cout<<x<< endl;  // statement 2 the issue ***********
    }
}
int main()
{
    int x;
    cout<<"please enter the number"<< endl;
    cin>>x;
    print(x);
    return 0;
}

Кто-нибудь может объяснить, что происходит с заявлением, в котором есть комментарий "Заявление о проблеме *****"
когда я запускаю программу, она отображает 1 2 3 4 5 но то, что я думаю, это должно отображать 5 4 3 2 1 поэтому программа выполняет оператор 1 перед оператором 2 или что происходит и если программа сначала выполняет оператор 1, как он достигает оператора 2, и выводит то, что я получаю, я думаю, что это должно быть получено с помощью оператора if

Спасибо

-6
Ahmed Araby 3 Сен 2017 в 22:33

4 ответа

Лучший ответ

Хорошо, это действительно просто.

Просто рассмотрите эти два момента, прежде чем двигаться дальше:

Точка 1: Когда функция вызывает другую функцию, первая функция, которая вызывает другую, называется функцией «вызывающего», вызываемая функция называется «вызываемой».

Точка 2: когда вызывается вызываемый, выполнение кода останавливается в точке, где был выполнен вызов, перемещается внутри вызываемого и проходит через вызываемого до тех пор, пока он не завершит все строки или не достигнет оператора возврата для не пустого места. функция или достигает другого вызова функции.

Так вот в вашей программе: main () вызывает print (x). main () прекращает выполнение там, где print (x); было написано

При условии, что x = 5, 5 передается в void print (int x).

Так что теперь внутри пустоты. х 5.

Оператор if (5 == 0) проверяется и оценивается как ложное, так что иначе выполняется {}.

Вот та часть, которая вас смущает:

Внутри else {} есть вызов функции print (x-1); это вызовет функцию print (int x) рекурсивно. передавая это значение 5-1 = 4. поэтому в этот момент функция не переходит к следующей строке для выполнения cout << x << endl; вместо этого он останавливается внутри этой функции и переходит в другую функцию.

Обратите внимание, как print (x-1) вызывается перед cout << x << endl; даже достигнуто.

Поэтому print (x-1) выполняется, проверяет оператор if и вызывает другой print (x-1). это продолжается до тех пор, пока x == 0, который имеет возврат без возвращаемых значений, который только завершает функцию.

Поэтому последний вызов функции (x == 0) завершается возвратом; заявление.

Функция перед ним, которая имела значение 1 (теперь запомним x = 1), продолжает с того места, где она остановилась, где было указано print (x-1), и выполняет код до конца функции, поэтому она выполняет cout << x << endl; с х = 1.

Затем, когда эта функция будет выполнена, функция до того, как она продолжит свое выполнение таким же образом, поэтому сначала печатается 1, теперь печатается 2, затем 3, 4 и 5 ... до тех пор, пока весь цикл функций не будет ожидать их очереди. вызываемый, чтобы закончить выполнение концов ..

Рекурсивные функции всегда доходят до последнего вызова и начинают оценку и финализацию с последнего до первого, потому что вызов функции останавливает вызывающую программу от продолжения выполнения своего кода и вместо этого заставляет программу выполняться внутри вызываемого.

2
Ali Rafizadeh 3 Сен 2017 в 21:45

Представьте на мгновение, что вместо этого рекурсивного вызова print у функции есть вызов какой-то другой функции, давайте назовем ее func(). Очевидно, что вызов func() будет выполняться до вставки потока в операторе 2.

Тот факт, что существует рекурсивный вызов, не меняет этого: вызов print() выполняется до вставки потока в операторе 2. Поэтому все, что делает этот рекурсивный вызов, происходит раньше вставки потока в утверждение 2.

Так, для вызова верхнего уровня, когда x равен 5, рекурсия все происходит сначала , а затем функция записывает 5 в std::cout. Таким образом, 5 будет последним.

0
Pete Becker 3 Сен 2017 в 20:37

Он пойдет на один уровень глубже и, как только x = 0, снова скатится снизу.
Таким образом, он выведет все числа от одного до первого х.

0
Nick B. 3 Сен 2017 в 21:14

Проще говоря, следуйте по пути исполнения:

  1. print(5) звонит print(4)
  2. print(4) звонит print(3)
  3. print(3) звонит print(2)
  4. print(2) звонит print(1)
  5. print(1) звонит print(0)
  6. print(0) возвращает
  7. обратно в print(1), он выводит 1 и возвращает
  8. обратно в print(2), он выводит 2 и возвращает
  9. обратно в print(3), он выводит 3 и возвращает
  10. обратно в print(4), он выводит 4 и возвращает
  11. обратно в print(5), он выводит 5 и возвращает
  12. и тогда вы закончите.
2
md5i 3 Сен 2017 в 19:39