把积极转为负面?

时间:2018-02-01 12:07:49

标签: java

我已获得此代码

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)"并且在此行之后无法访问。

4 个答案:

答案 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))); 
   }
}

我上面的假设是,函数的初始输入将始终为正。您的原始代码确认了这一假设。