为什么这种递归在C++中起作用?

Pik*_*er2 2 c++ recursion return undefined-behavior

我做了一个递归的C++程序,看起来像这样:

using namespace std;
#include <iostream>

bool recursive(int num)
{
    if (num == 6)
    {
        return false;
    }

    else if (num > 6)
    {
        return true;
    }

    else
    {
        if (recursive(num + 1))
        {
            return true;
        }

        else
        {
            return false;
        }
    }
}


int main()
{
    if (recursive(0))
    {
        cout << "Not found!" << endl;
    }

    else
    {
        cout << "Found..." << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

它起作用,我认为这是(大致)最好的方法.

我的朋友制作了一个更简单的递归程序,如下所示:

using namespace std;
#include <iostream>

bool recursive(int num)
{
    if (num == 6)
    {
        return false;
    }

    else if (num > 6)
    {
        return true;
    }

    else
    {
        recursive(num + 1);
    }
}


int main()
{
    if (recursive(0))
    {
        cout << "Not found!" << endl;
    }

    else
    {
        cout << "Found..." << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

他的作品和我一样,但我不明白为什么会这样.对我来说,看起来在他的else块中没有返回任何内容,所以我不明白布尔值如何返回到原始函数调用.

出于好奇,我在JavaScript中制作了一个类似的程序:

function recursive(index)
{
    if (index == 6)
    {
        return true;
    }

    else if (index > 6)
    {
        return false;
    }

    else
    {
        recursive(index + 1);
    }
}

if (recursive(0))
{
    console.log("found");
}

else
{
    console.log("not found");
}
Run Code Online (Sandbox Code Playgroud)

但JavaScript程序不起作用,这让我觉得这是特定于C++的.

为什么我朋友的计划有效?它完全有效,还是未定义的行为?

Joh*_*ica 6

它为什么有效?答:没有.

else
{
    recursive(num + 1);
}
Run Code Online (Sandbox Code Playgroud)

你朋友的节目缺少一个return声明.

else
{
    return recursive(num + 1);
}
Run Code Online (Sandbox Code Playgroud)

不从非void函数返回值会导致未定义的行为.

在这种情况下,碰巧在您测试的计算机上,递归调用的返回值被自动"返回"给调用者 - 可能是因为它碰巧在正确的寄存器中.这是纯粹的偶然事件.你不能依赖它.在不同的机器上,或不同的编译器,甚至是不同的调用,程序也可以返回别的东西,或崩溃,或做任何你能想象的事情.