bool返回递归函数意外地改变变量

时间:2015-11-02 18:26:26

标签: c++

有人可以向我解释一下这会发生什么吗?从我所拥有的一点点知识(显然我的想法是错的),对我而言,这应该继续将x减少1直到x为3.然后它应该转到'返回true,part并且当函数返回时是的,它返回到第二个if语句,返回false然后退出函数,因为如果函数返回false则无处可做。但这会继续回到第二个if语句,将x添加1,直到再次为9,然后退出。提前致谢。

 bool Rec(int x)
    {
        if( x > 3)
        {
            if(Rec(x - 1) == true)
            {
                return false;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return true;
        }

    }
    void main()
    {
        Rec(9);
    }

2 个答案:

答案 0 :(得分:0)

实际上,我没有发现代码运行方式存在问题。它确实有效。

它可以简化,相当于:

#include <stdio.h>

bool Rec(int x)
{
    printf("x = %d\n", x);

    if (x > 3)
    {
        Rec(x - 1);
        return false;
    }

    return true;
}

int main(int argc, char* argv[])
{
    Rec(9);
    return 0;
}

产生:

x=9
x=8
x=7
x=6
x=5
x=4
x=3

但是你也说过:&#34;但是这会继续回到第二个if语句,将x加1,直到再次为9,然后退出&#34; 。但你实际上并没有在x中添加1。我认为发生的事情是你的调试。您还没有在代码中进行任何调试以打印出所述行为。

所以我会尝试为你做这件事。

bool Rec(int x)
{
    printf("x = %d\n", x);

    if (x > 3)
    {
        Rec(x - 1);
        printf("*x = %d\n", x);

        return false;
    }

    return true;
}

产生:

x = 9
x = 8
x = 7
x = 6
x = 5
x = 4
x = 3
*x = 4
*x = 5
*x = 6
*x = 7
*x = 8
*x = 9

仔细想想。您没有添加1.您的功能再次调用自己打印x =然后如果它大于3则执行相同操作。只有当x>它回来了吗?返回后它将再次打印* x = 所以它实际上是在递归调用之前打印x。我希望这可以帮助你了解正在发生的事情。

你的函数很好看看递归是如何工作的。但实际上你永远不会写那样的代码。因为你可以把它写成一个简单的循环。

如果您可以使用循环来提供代码,请避免递归。但有时候,递归更容易。例如,遍历二进制树非常简单。

这里有一些关于这个问题的答案,给出了递归有意义的真实世界的例子。 Real-world examples of recursion

答案 1 :(得分:-1)

这是递归的本质。你调用了6次函数,它将返回6次。