在递归代码中得到奇怪的输出!尽管逻辑似乎是正确的
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),则:
- 溶胶={10}
- 模式(5)
- 溶胶 = {10, 5}
- pattern(0) -> sol = {10, 5, 0} -> return sol -> 但你不会在任何地方存储 pattern 的 return 值,所以 return 值丢失
- 溶胶 = {10, 5, 0, 5}
- 函数 returns 垃圾,但也没有在任何地方捕获
- 溶胶 = {10, 5, 0, 5, 10}
- 函数returns 被ans.
捕获的垃圾
实际上,您的函数根本不需要 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>
我一直在尝试提出一个关于递归模式的问题,这是一个非常简单的问题,但我无法理解为什么我会得到如此意外的输出。我跟踪了调用堆栈中的变量和参数,我的逻辑似乎是正确的,但它仍然在打印随机数。
#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),则:
- 溶胶={10}
- 模式(5)
- 溶胶 = {10, 5}
- pattern(0) -> sol = {10, 5, 0} -> return sol -> 但你不会在任何地方存储 pattern 的 return 值,所以 return 值丢失
- 溶胶 = {10, 5, 0, 5}
- 函数 returns 垃圾,但也没有在任何地方捕获
- 溶胶 = {10, 5, 0, 5, 10}
- 函数returns 被ans. 捕获的垃圾
实际上,您的函数根本不需要 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>