我已获得此代码
public class FiboNegativV {
int negativ(int nv) {
if (nv ==0)
return 1;
if (nv ==1)
return 2;
return negativ(nv-1) + negativ(nv-2);
}
}
现在我想将最终的数字变为负数。我尝试了一些像" nv = -nv;"但是当我把它放在之前时,我通常会有堆叠 "返回negativ(nv-1)+ negativ(nv-2)"并且在此行之后无法访问。
答案 0 :(得分:2)
你不需要这样的功能就像这样:
int x *= -1;
答案 1 :(得分:0)
如果您只想将正面转换为负数,那么
nv = (nv > 0) ? nv * -1 : nv
如果你想将正面转为负面而负面转为正面,那么
nv = nv * -1
您的代码下方将显示为
public class FiboNegativ
{
public FiboNegativV(){}
int negativ(int nv)
{
return (nv > 0) ? nv*-1 : nv;
}
}
答案 2 :(得分:0)
由于某种原因,所有其他答案都忽略了您对Fibbonacci序列的初步意图。但我不明白为什么他们不保持上下文。你的方法显然试图用递归产生负数的Fibbonacci序列。
现在我想将最终数字变为负数。
最简单,最直观的方法是使用一元减号运算符 =只需在表达式前加一个减号(所以否定x
到-x
) 。我们仅在正数上使用它,因此负数保持负数:(注意:这是一个三元运算符)
(result > 0) ? -result : result;
然而大错误是你首先不在递归方法中处理负数!当然你会遇到堆栈溢出,因为递归负数会越来越低。
static int negativFib(int nv)
{
//turn negative input into positive
nv = nv < 0 ? -nv : nv;
//base cases
if (nv == 0)
return 1;
if (nv == 1)
return 2;
final int result = negativFib(nv - 1) + negativFib(nv - 2);
//turn the number into negative
return result > 0 ? -result : result;
}
另一个可能出现的问题是,对于大数字,递归会导致堆栈溢出。您可以通过使用其他算法来防止这种情况,例如: dynamic programming。使用动态编程Fibbonacci序列,每次都存储前2个结果,并在迭代中解决问题,而不是递归。
答案 3 :(得分:0)
由于您只希望最终数字为负数,因此最简单的方法是使用绝对数字,并返回负数,如下所示:
public class FiboNegativV {
int negativ(int nv) {
return (nv == 0) ? -1 :
(nv == 1) ? -2 :
-(Math.abs(negativ(nv-1)) + Math.abs(negativ(nv-2)));
}
}
我上面的假设是,函数的初始输入将始终为正。您的原始代码确认了这一假设。