如果我在函数

时间:2017-09-03 19:33:02

标签: c++ function recursion

#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 五 但我认为它必须显示出来 五 4 3 2 1 所以程序在语句2之前执行语句1或发生了什么 并且如果程序首先执行语句1它如何到达语句2并打印我得到的内容我认为它必须通过if语句得出

谢谢

4 个答案:

答案 0 :(得分:2)

很简单,遵循执行路径:

  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. 然后你就完成了。

答案 1 :(得分:0)

暂时假装该函数调用其他函数而不是递归调用print,而是调用它func()。显然,对func()的调用将在语句2中的流插入之前运行。

存在递归调用的事实并没有改变这一点:对print()的调用在之前在语句2中的流插入中进行。所以无论递归调用是什么在语句2中的流插入之前发生

因此,对于顶级调用,当x为5时,递归全部发生第一次,然后函数将5写入std::cout。所以5将是最后一次。

答案 2 :(得分:0)

它将更深一层,一旦x = 0,它将从底部再次卷起。
因此它会将所有数字从一个输出到第一个x。

答案 3 :(得分:0)

好的,这很简单。

在继续之前,请考虑以下两点:

第1点: 当一个函数调用另一个函数时,调用另一个函数的第一个函数称为“调用者”函数,被调用的函数称为“被调用者”。

第2点:当调用被调用者时,代码执行在调用点处停止并在被调用者内部移动并一直运行通过被调用者,直到它完成所有行或达到return语句为止非void函数或到达另一个函数调用。

所以在你的程序中: main()调用print(x)。 main()停止执行print(x);是写的

假设x = 5,则将5传递给void print(int x)。

所以现在无效。 x是5.

检查if(5 == 0)语句并将其计算为false,否则执行{}。

这是困扰你的部分:

在else {}里面,有一个函数调用print(x-1); 这将以递归方式调用函数print(int x)。传递它的值为5-1 = 4。 所以此时,该函数不会继续执行下一行来执行cout&lt;&lt; x&lt;&lt; ENDL;相反,它暂停在此功能内并进入另一个功能。

注意在cout&lt;&lt;之前如何调用print(x-1) x&lt;&lt; ENDL;甚至达到了。

所以print(x-1)运行,检查if语句,并调用另一个print(x-1)。 这将继续,直到x == 0,其返回没有返回值,只返回函数。

所以最后一个函数调用(x == 0)被返回终止;言。

之前的函数,其值为1(现在记住x = 1),从暂停的位置继续,这是print(x-1)所在的位置,并执行代码到函数的末尾,所以它执行cout&lt;&lt; x&lt;&lt; ENDL; x = 1。

然后当这个函数完成时,它之前的函数以相同的方式继续执行,所以先打印1,然后打印2,然后打3,4和5 ...直到整个函数循环等待他们的被叫者完成执行结束的行...

递归函数总是到达最后一个调用,并开始从最后一个调用并最终确定,因为函数调用会阻止调用者继续执行其代码,而是使程序在被调用者中执行。