我尝试解决3n + 1问题(UVa 100),这里是我的代码但是根据UVa在线判断我的程序给出了错误的答案,我的代码通过了我能想到但无法检测到的所有测试用例错了,请帮我找错。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> Num;// for Memoization till 1000000
int counter(long int j) {
if(j > 1000000) {
if(j%2 == 1) return(counter((3*j+1)>>1)+2);
else return(counter(j>>1)+1);
}
else {
if(Num[j] != 0) return Num[j];
if(j%2 == 1) Num[j] = counter(3*j+1)+1;
else Num[j] = counter(j>>1)+1;
}
}
int main() {
Num.resize(1000001);//auto initilizes the vector with 0
Num[1] = 1; // set the counter for n = 1 as 1;
int X,Y;
while ( cin >> X >> Y ) {
int x = X , y = Y, mxl = 0;
if(X > Y) swap(X,Y);
for ( long int j = Y; j >= X; --j) {
if(Num[j] == 0) counter(j);
if(mxl < Num[j]) mxl = Num[j];
}
cout << x << " " << y << " " << mxl << endl;
}
return 0;
}
答案 0 :(得分:1)
int counter(long int j) {
if(j > 1000000) {
if(j%2 == 1) return(counter((3*j+1)>>1)+2);
else return(counter(j>>1)+1);
}
else {
if(Num[j] != 0) return Num[j];
if(j%2 == 1) Num[j] = counter(3*j+1)+1;
else Num[j] = counter(j>>1)+1;
}
}
在最后一个代码段{外部Num[j] == 0
)else
的情况下,您的返回值在哪里?
您将 Num[j]
设置为正确的值,但永远不会将其返回。
我怀疑你所追求的是什么(摆脱那些完全不必要的if..return..else
构造):
int counter(long int j) {
if(j > 1000000) {
if(j%2 == 1)
return(counter((3*j+1)>>1)+2);
return(counter(j>>1)+1);
}
if(Num[j] != 0)
return Num[j];
if(j%2 == 1)
Num[j] = counter(3*j+1)+1;
else
Num[j] = counter(j>>1)+1;
return Num[j]; // This is important.
}
但是,我应该提一下,递归可能不是这里使用的理想工具。首先,序列可能很长的可能性意味着在获得解决方案之前可能会耗尽堆栈空间。
其次,递归调用不而没有成本。在搜索解决方案时,可能会花费大量时间来设置和拆除堆栈帧。
我倾向于选择迭代解决方案来避免这些潜在问题。