Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;递归函数中的递增_C++_Console Application - Fatal编程技术网

C++ C++;递归函数中的递增

C++ C++;递归函数中的递增,c++,console-application,C++,Console Application,我在grepper和查找递归函数示例时发现了此代码段。我理解refursive部分,函数如何调用自身-1直到它到达基本情况,但是,我不理解else中的最后一行。我只是想弄清楚最后一行是如何返回到起始值的。代码中没有任何东西将其设置为+1,而且,当它返回时,它是调用函数本身还是只是一个我不知道的规则?我只是想了解一下这里的逻辑 void PrintTest(int test) { if (test < 1) { return; // Exit conditio

我在grepper和查找递归函数示例时发现了此代码段。我理解refursive部分,函数如何调用自身-1直到它到达基本情况,但是,我不理解else中的最后一行。我只是想弄清楚最后一行是如何返回到起始值的。代码中没有任何东西将其设置为+1,而且,当它返回时,它是调用函数本身还是只是一个我不知道的规则?我只是想了解一下这里的逻辑

void PrintTest(int test)
{
    if (test < 1)
    {
        return; // Exit condition, known as "base case"
    }
    else
    {
        cout << test << " ";
        PrintTest(test-1);
        cout << test << " ";
    }
}

int main()
{
    int a;
    cout << "Enter a number prefarably between 2 and 9: ";
    cin >> a;
    PrintTest(a);
void打印测试(int测试)
{
如果(测试<1)
{
return;//退出条件,称为“基本情况”
}
其他的
{
cout它不会“增加备份的数量”

在递归步骤之后,处理将继续到停止的位置。因此,您只看到“较低”的堆栈帧完成了处理

以下是事件的顺序,从上到下:

PrintTest(3)        PrintTest(2)         PrintTest(1)         PrintTest(0)
===============================================================================
cout << 3 << " ";
PrintTest(3-1);     cout << 2 << " ";
                    PrintTest(2-1);      cout << 1 << " ";
                                         PrintTest(1-1);      return;
                                         cout << 1 << " ";
                    cout << 2 << " ";
cout << 3 << " ";
PrintTest(3)PrintTest(2)PrintTest(1)PrintTest(0)
===============================================================================

可以考虑这个更简单的情况:

void foo(int x) {
     std::cout << x << '\n';
     bar(x-1);
     std::cout << x << '\n';
}

现在用
foo
替换
bar
,并为递归添加一个停止点,您将获得与
PrintTest
相同的结果,您可以尝试按引用传递。对传递的
test
的所有更改都引用原始
a

void PrintTest(int& test) // pass-by-reference
{ 
    if (test < 1)
    {
        return;
    }
    else
    {
        cout << test << " ";
        test -= 1;                // decrease self 
        PrintTest(test);          // and pass reference
        cout << test << " ";
    }
}
void PrintTest(int&test)//通过引用传递
{ 
如果(测试<1)
{
返回;
}
其他的
{

cout提示:
test
从不以任何方式递增或修改
PrintTest
的每次调用都有自己的变量
test
。为了更好地理解,请在每次输入
PrintTest
函数时添加4个空格边距。您还可以在第一行和最后一行添加cout,以便在输入和y时进行跟踪你离开
PrintTest
函数。只是想让你知道我是编程新手,这周刚开始学习。我可以接受你的话“你只是看到较低的堆栈帧完成了它们的处理”,但是,我还是不太明白。它正在打印与原始值相同的次数,就好像它在一个循环中,但它不是。既然最后一个cout只调用了一次,为什么不打印一次呢?@UniverseX你必须问编写它的人!没有代码是可以的。我不是说只显示一次。这是正确的简单,只需注释掉最后一行cout。我的意思是,我仍在试图理解堆栈帧(如您所称)是如何通过一个cout调用单独显示这些最后的数字的。@UniverseX one cout call->一行输出,这正是您得到的结果。很抱歉,我不太理解这一点上的混乱。是的,但是它仍然会将0打印到控制台x次。为什么不只打印一次呢?将自己打印x次就好像它在一个循环中一样,这仍然会吸引我。顺便说一句,我对编程有点陌生。现在刚刚进入学习阶段。
void PrintTest(int& test) // pass-by-reference
{ 
    if (test < 1)
    {
        return;
    }
    else
    {
        cout << test << " ";
        test -= 1;                // decrease self 
        PrintTest(test);          // and pass reference
        cout << test << " ";
    }
}