我有这段代码,我现在已经工作了大约半个小时了。它非常简单,但它不起作用。我有一个方法,它应该返回三个数字,这些数字与给定的参数相加。我希望它是随机的,所以我使用Random类。但首先我必须确保它是正确的。如果不对。我只是重新运行该方法,直到它返回一个正确的值。但由于某种原因,我不断收到StackOverflowException。真的很奇怪。 '=='运算符根本不起作用!这是我正在使用的完整代码(我确实简化了它,因此我可以很容易地显示它):
public static int[] getNumbersFor(int f)
{
Random r = new Random();
int l = (r.nextInt(20) + 20) / 2;
int a = l + l % 2;
int[] i = new int[]
{
(int) (f - a / 2 - l % 2),
(int) (f + a),
(int) (f - a / 2 + l % 2)
};
int b = (i[0] + i[1] + i[2]);
int c = ((i[0] + i[1] + i[2]) / 3);
boolean d = i[0] + i[1] + i[2] == f / 3;
System.out.println(f + ", " + a + ", " + b + ", " + c + ", " + d);
return i[0] + i[1] + i[2] == f / 3 ? i : getNumbersFor(f);
}
public static void main(String[] args)
{
int[] i = getNumbersFor(33);
System.out.println(i[0] + ", " + i[1] + ", " + i[2]);
}
这应该是正确的!它不是。我不知道为什么它不正确!我想知道它是否与我的计算机本身有关,所以我here's(pastebin)从System.getProperties().list(System.out)
的完整日志中获得了什么。如果你需要知道这个的输出。这是我一直得到的错误本身的一小部分:
33, 14, 99, 33, false
33, 10, 99, 33, false
33, 14, 99, 33, false
33, 16, 99, 33, false
33, 20, 99, 33, false
Exception in thread "main" java.lang.StackOverflowError
at sun.nio.cs.UTF_8.updatePositions(UTF_8.java:77)
at sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(UTF_8.java:564)
at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:619)
at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:561)
at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:271)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207)
at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129)
at java.io.PrintStream.write(PrintStream.java:526)
at java.io.PrintStream.print(PrintStream.java:669)
at java.io.PrintStream.println(PrintStream.java:806)
at moretesting.NewClass.getNumbersFor(NewClass.java:16)
at moretesting.NewClass.getNumbersFor(NewClass.java:17)
at moretesting.NewClass.getNumbersFor(NewClass.java:17)
at moretesting.NewClass.getNumbersFor(NewClass.java:17)
at moretesting.NewClass.getNumbersFor(NewClass.java:17)
... (This is repeated TONS of times, I just omitted it)
Here's完整日志。 (再次粘贴。它非常大,几千行!)
答案 0 :(得分:3)
==
工作正常,你只是在比较不相等的事情。以下是运行代码的示例值评估:
i[0] + i[1] + i[2] == f / 3
26 + 47 + 26 == 33 / 3
99 == 11
false
生成的每组数字都遵循这种模式:数字总和为99,你将它与11进行比较,它因为条件为假而递归,然后由于无限递归而堆叠溢出(它不能产生将通过的值条件)。
答案 1 :(得分:0)
这行代码是递归调用你的函数。
class boxes {
protected:
int x = 0;
public:
void setx (int input) {
x = input;
}
int getx () {
return x;
}
} box;
box.setx(5);
vector <boxes> tetris;
tetris.push_back(box);
cout << box.getx();
cout << tetris.back().getx();
仔细检查您的代码并理解递归永远不会终止的原因。
调用函数调用时,会在调用堆栈上分配堆栈帧。堆栈帧包含调用方法的参数,其本地参数以及方法的返回地址。 如果没有新堆栈帧的空间,那么Java虚拟机(JVM)将抛出StackOverflowError。
谨慎使用函数递归。如果您已验证正确实现了递归,则可以增加堆栈的大小,以便允许更多的调用。
答案 2 :(得分:0)
我不确定递归真的是解决这个问题的方法。至少,随机猜测数字,直到你偶然发现一个加起来你的输入的组合似乎非常低效。
如果您只是在寻找三个与输入参数相加的伪随机数,为什么不这样做呢?
public static int[] getNumbersFor(int number)
{
int firstMax = 0;
int firstMin = 0;
int secondMax = 0;
int secondMin = 0;
if (number > 100)
{
firstMax = 100;
if (number > 200)
{
firstMin = number - 200;
}
}
Random r = new Random();
int firstRand = r.nextInt(firstMin, firstMax);
int a = firstRand;
int temp = number - a;
if (temp > 100)
{
secondMax = 100;
secondMin = temp - 100;
}
int secondRand = r.nextInt(secondMin, secondMax);
int b = secondRand;
int c = temp - b;
return new int[] { a, b, c };
}