Java 把积极变成消极?

Java 把积极变成消极?,java,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”的方法,但当我把它放在 “return negat

我有这个密码

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”的方法,但当我把它放在
“return negative(nv-1)+negative(nv-2)”,当它在这一行之后时是无法访问的。

您不需要函数,只需这样做:

int x *= -1;
如果你只想把正数转换成负数,那么

nv=(nv>0)?nv*-1:nv

如果你想把正数转换成负数,把负数转换成正数,那么

下面是您的代码

public class FiboNegativ
 {

    public FiboNegativV(){}

      int negativ(int nv)
      {
         return (nv > 0) ? nv*-1 : nv; 
      }
}

由于某种原因,所有其他答案都忽略了斐波那契序列的初始意图。但我不明白他们为什么不保持上下文。显然,您的方法尝试使用递归生成负数的斐波那契序列


现在我想把最后的数字变成负数

求反一个数最简单、最直观的方法是使用一元减号运算符=只需在表达式前加一个减号(因此求反
x
-x
)。我们只在正数上使用它,所以负数保持为负数:(注:这是一个三元运算符)

然而,最大的错误是,您首先没有在递归方法中处理负数!当然,您会遇到堆栈溢出,因为递归负数会越来越低

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;
}
static int negativefib(int nv)
{
//把消极的投入变成积极的投入
nv=nv<0?-nv:nv;
//基本情况
如果(nv==0)
返回1;
如果(nv==1)
返回2;
最终int结果=负FIB(nv-1)+负FIB(nv-2);
//把数字变成负数
返回结果>0?-结果:结果;
}

替代算法
另一个可能出现的问题是,对于大数字,递归会导致堆栈溢出。您可以通过使用其他算法来防止这种情况,例如。使用动态规划斐波那契序列,您每次存储前2个结果,并在迭代中解决问题,而不是递归。

由于您只希望最终数字为负数,最简单的方法是使用绝对数,并返回负数,如下所示:

public class FiboNegativV {
    int negativ(int nv) {
        return (nv == 0) ? -1 :
            (nv == 1) ? -2 : 
            -(Math.abs(negativ(nv-1)) + Math.abs(negativ(nv-2))); 
   }
}

上面我所做的假设是,函数的初始输入总是正的。您的原始代码证实了这一假设

如果
x
是不必要的,为什么会出现在您的问题中?当然,return语句之后的每个语句都是不可访问的,您还期望得到什么?您的问题不是否定一个数字,但由于大量(可能是不必要的)递归,您似乎得到了一个
stackoverflowerr
。你从什么数字开始?您调试了代码吗?您可以应用简单的条件
number=(number>0)?数字*-1:number
@Florian Nolte也许你应该给出一个你想要的序列的例子,应该是
-1,-1,-2,-3,-5,-8,
?那么负输入呢?是的,但是我在哪里写这行呢?你完全改变了OP方法的功能,忽略了斐波那契sequence@Hawk是的,但是Florian的功能是这样的,我只是想尽量减少他的代码@BinitGhetiya首先包括完全冗余的x字段和构造函数;第二,你完全重写了他的方法,甚至没有在那里留下一条评论,指出该方法中应该有任何其他内容——这完全是错误的misleading@Hawk兄弟x的东西不是我编的它的提问者定义的值!在上面的评论中,你可以看到他问我在哪里对代码进行更改
是的,但是我在哪里写下了这行?
所以我复制粘贴了他的代码,并进行了相关的更改,以便他的代码可以工作。。我可以看出他是java的初学者和开发人员,OP没有明确说明他们在写一个Fibonacci生成器而不是类名。题目是“化正数为负数”。我们的答案都回答了这个问题。@MarkYisri“现在我想把最后的数字变成负数。”他只想改变结果,而不是整个方法,但你已经全部重写了。问题中唯一一个稍微提到斐波那契的部分就是类名。“你不能外推一个词而产生一个不同的问题。@MarkYisri我不同意,他的实现显然是递归Fib的尝试。如下。可能有点奇怪,因为它通常类似于
1,1,2,3,…
,但他用从0开始向上的输入实现它:
1,2,3,…
这不编译,
int x=VALUE
应该在
x*=-1之前声明同时对负数求反会产生一个正数,并且希望“将最终的数字变成负数”
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;
}
public class FiboNegativV {
    int negativ(int nv) {
        return (nv == 0) ? -1 :
            (nv == 1) ? -2 : 
            -(Math.abs(negativ(nv-1)) + Math.abs(negativ(nv-2))); 
   }
}