在递归代码中得到奇怪的输出!尽管逻辑似乎是正确的

Getting wierd output in recursion code! Even though logic seems to be correct

我一直在尝试提出一个关于递归模式的问题,这是一个非常简单的问题,但我无法理解为什么我会得到如此意外的输出。我跟踪了调用堆栈中的变量和参数,我的逻辑似乎是正确的,但它仍然在打印随机数。

#include <bits/stdc++.h>
using namespace std;

vector<int> pattern(int);
int main()
{
    int n;
    cin >> n;
    vector <int> ans = pattern(n);

    for (int u: ans)
    {
        cout << u << " ";
        
    }
    cout << "\n";
}
vector<int> sol;
vector<int> pattern(int N)
{
    if (N <= 0)
    {
        // cout << "stopped" << endl;
        sol.push_back(N);
        return sol;
    }

    sol.push_back(N);
    pattern(N-5);
    sol.push_back(N);
    
}
i/p: 10 
expected o/p: 10 5 0 5 10 


but it is giving this result:

6422500 1997786416 -1172770555 0 6422508 1997703885 -1 1997899634 0 0 4199136 2576384 0 32 0 0 0 10672 726272 791648 826264 57158026 0 35651584 0 590440 36175880 524296 590376 36175880 524298 524832 35651584 9 655944 34603080 4718603 721424 34604104 4718597 328208 34604104 71303179 262672 34603080 4718599 262672 34604096 71827463 197252 58785856 -2143289343 66305 34635840 71958539 66434 50495552 -2143289343 524840 38273024 524295 721424 34603016 524293 721424 51512330 -2080374783 560 34866184 3 66322 34635784 655371 721424 50397184 -2147287039 66305  ..... [Truncated]```

您缺少来自 pattern() 函数的 return 语句。

vector<int> pattern(int N)
{
    if (N <= 0)
    {
        // cout << "stopped" << endl;
        sol.push_back(N);
        return sol;
    }

    sol.push_back(N);
    pattern(N-5);
    sol.push_back(N);
    
    return sol;           // <--------- this was missing
}

令 N = 10,因此将调用 pattern(10),则:

  1. 溶胶={10}
  2. 模式(5)
  • 溶胶 = {10, 5}
  • pattern(0) -> sol = {10, 5, 0} -> return sol -> 但你不会在任何地方存储 pattern 的 return 值,所以 return 值丢失
  • 溶胶 = {10, 5, 0, 5}
  • 函数 returns 垃圾,但也没有在任何地方捕获
  1. 溶胶 = {10, 5, 0, 5, 10}
  2. 函数returns 被ans.
  3. 捕获的垃圾

实际上,您的函数根本不需要 return 一个 vector,因为您的 vector 被声明为全局函数。您可以使用 void return 类型,它可以在没有任何 return 语句的情况下工作。下面的代码工作正常:

#include <iostream>
#include <vector>
using namespace std;

vector<int> sol;
void pattern(int);

int main()
{
    int n;
    cin >> n;
    pattern(n);

    for (auto& u: sol)
    {
        cout << u << " ";
        
    }
    cout << "\n";
}

void pattern(int N)
{
    if (N <= 0)
    {
        // cout << "stopped" << endl;
        sol.push_back(N);
        return;
    }

    sol.push_back(N);
    pattern(N-5);
    sol.push_back(N);
}

另外一个旁注,很多人建议不要使用:

#include <bits/stdc++.h>

改为使用单个包含:

#include <iostream>
#include <vector>