对于第二部分:
还有为什么这个实现总是给我stackoverflow(再次不知道哪些输入)?
试试这个输入集:
5 3 1 16 5 10
它会给你stackoverflow错误。对于您在 pastebin 中的给定代码。
为什么 ?
如果输入是'1',就会出现这个问题。
编辑您的代码部分,如下所示,并查看输入的输出 (1 1)。
public static int divisor(int m, int n) {
System.out.println("### "+m+" "+n);
if (m == 0 || n == 0) {
return m + n;
} else if (m > n) {
return divisor(n, m % n);
} else {
return divisor(m, n % m);
}
}
在某些方面会是这样的:
.
.
### 1 1134903170
### 1 0
### 1 1836311903
### 1 0
### 1 -1323752223
### -1323752223 1
### -1323752223 1
### -1323752223 1
.
.
因为在您的代码中,函数调用如下所示。
public static int divFib(int num) {
int i = 1, j = 2, temp;
while (divisor(num, j) == 1) {
temp = j;
j = j + i;
i = temp;
}
return j;
}
divisor(num, j) 将像 divisor(1, 2) 一样被调用,然后下面的部分将执行
else {
return divisor(m, n % m);
}
调用将类似于除数(1,0),因为 n%m = 2%1 =0
那么 '1' 将作为 (m+n = 1) 返回。
然后 while (divisor(num, j) == 1){} 将再次执行并且 'j' 将增加。但是'num'是'1'。同样的事情一次又一次地发生。结果 'j' 是一个巨大的数字,最终它将分配一个负数。(我想你知道它为什么会发生)。
问题是这永远不会停止。因此堆栈将由于大量的函数调用而溢出。
我认为这是一个非常清楚的解释,如果您有任何疑问,请询问。(对不起,我错误地在这里发布了答案。)