1D Peak,执行时表示错误导致代码停止工作
1D Peak, on execution says an error has caused the code to be stop working
我试图通过分而治之的技术在这个特定问题中找到一维峰,
我的程序即使它运行,
但在给出最终输出时,它说执行过程中出现了一些问题,
我从不同的方法得到了答案,但我想知道我错在哪里。
#include<iostream>
using namespace std;
int a[8];
class pg1
{
public:
int func(int n)
{
if(a[n] <= a[n+1])
{
func(n++);
}
else if(a[n] <=a [n-1])
{
func(n--);
}
else
{
return n;
}
}
};
int main()
{
pg1 ob;
for(int i=0;i<8;i++)
{
cin >> a[i];
}
int x = ob.func(4);
cout << endl << x;
return 0;
}
输入-
5个
6个
8个
5个
4个
3个
6个
4
错误是-
1D Peak.exe 已停止工作。
导致程序停止工作的问题 correctly.Windows 将关闭程序并在有可用解决方案时通知您。
最终结果-
进程退出 return 值 3221225725
不要在函数调用中使用后增量和类似的东西。
这是将问题浓缩为一段非常简单的代码
#include <iostream>
int test(int n){
if(n == 1){
std::cout << "Function called!";
return test(n++);
}else{
return 0;
}
}
int main() {
test(1);
return 0;
}
在你 运行 这之前,问问自己你期望在这里发生什么。和你想的一样吗?
当您 运行 执行此操作时,您会发现代码未正确终止。输出显示该函数被无限次调用,最终堆栈 运行 超出 space 并且程序崩溃。
您可以在此处查看此代码的运行情况:http://ideone.com/QL0jCP
在你的程序中你有同样的问题:
int func(int n)// say n = 4
{
if(a[n] <= a[n+1])//say this is true
{
func(n++); //this calls func(4) THEN increments n afterwards
}
这会用相同的值一遍又一遍地调用 func
。
解决方案是不要在函数调用中使用后递增或后递减。正如您在这个问题中看到的那样,这些会造成难以诊断的错误。只需一个简单的 func(n+1)
即可。如果您以后需要使用该变量,则只需创建一个显式变量即可,这样的编码风格要简洁得多(正如您 运行 进入此处所显示的这个问题)。
修复此问题后,您需要修复数组边界检查。
if(a[n] <= a[n+1])
如果 n
是数组中的最后一个位置,您突然试图访问数组末尾之后的一个位置,如果幸运的话,您会遇到段错误和崩溃,如果不幸的话,您得到一些很难找到的错误,这些错误会扰乱您的系统。您要检查值是否有效。
我试图通过分而治之的技术在这个特定问题中找到一维峰, 我的程序即使它运行, 但在给出最终输出时,它说执行过程中出现了一些问题, 我从不同的方法得到了答案,但我想知道我错在哪里。
#include<iostream>
using namespace std;
int a[8];
class pg1
{
public:
int func(int n)
{
if(a[n] <= a[n+1])
{
func(n++);
}
else if(a[n] <=a [n-1])
{
func(n--);
}
else
{
return n;
}
}
};
int main()
{
pg1 ob;
for(int i=0;i<8;i++)
{
cin >> a[i];
}
int x = ob.func(4);
cout << endl << x;
return 0;
}
输入- 5个 6个 8个 5个 4个 3个 6个 4
错误是- 1D Peak.exe 已停止工作。 导致程序停止工作的问题 correctly.Windows 将关闭程序并在有可用解决方案时通知您。
最终结果- 进程退出 return 值 3221225725
不要在函数调用中使用后增量和类似的东西。
这是将问题浓缩为一段非常简单的代码
#include <iostream>
int test(int n){
if(n == 1){
std::cout << "Function called!";
return test(n++);
}else{
return 0;
}
}
int main() {
test(1);
return 0;
}
在你 运行 这之前,问问自己你期望在这里发生什么。和你想的一样吗?
当您 运行 执行此操作时,您会发现代码未正确终止。输出显示该函数被无限次调用,最终堆栈 运行 超出 space 并且程序崩溃。
您可以在此处查看此代码的运行情况:http://ideone.com/QL0jCP
在你的程序中你有同样的问题:
int func(int n)// say n = 4
{
if(a[n] <= a[n+1])//say this is true
{
func(n++); //this calls func(4) THEN increments n afterwards
}
这会用相同的值一遍又一遍地调用 func
。
解决方案是不要在函数调用中使用后递增或后递减。正如您在这个问题中看到的那样,这些会造成难以诊断的错误。只需一个简单的 func(n+1)
即可。如果您以后需要使用该变量,则只需创建一个显式变量即可,这样的编码风格要简洁得多(正如您 运行 进入此处所显示的这个问题)。
修复此问题后,您需要修复数组边界检查。
if(a[n] <= a[n+1])
如果 n
是数组中的最后一个位置,您突然试图访问数组末尾之后的一个位置,如果幸运的话,您会遇到段错误和崩溃,如果不幸的话,您得到一些很难找到的错误,这些错误会扰乱您的系统。您要检查值是否有效。