Java:简单递归函数只返回1

时间:2010-09-27 19:06:21

标签: java algorithm factorial

奇怪的是我的第一个Java应用程序,我想要实现一个任意精度因子函数,我做了递归一个很好,但我的迭代只输出“1”而没有别的..这对我来说太晚了我可以不知道为什么,我不知道我哪里出错了,这里有什么明显的东西吗?

public static BigInteger ifact(BigInteger n) {
    BigInteger ret = new BigInteger("1");
    BigInteger i = new BigInteger("1");
    for(i = new BigInteger("0"); i.compareTo(n) == 0; i.add(new BigInteger("1"))){
        ret.multiply(i);
    }
    return ret;
}

如果您没有注意到它使用了BigInteger包,请查看奇怪的文章..

另外,像C一样,你可以做类似于typedef的事情,所以我不需要每次都输入“BigInteger”吗?

编辑:我想我的意思是将ret设置为n,可能是它,或者......可能不是。

4 个答案:

答案 0 :(得分:5)

尝试更改

ret.multiply(i);

ret = ret.multiply(i);

答案 1 :(得分:5)

在回答你的“typedef”问题时,不,你不能用Java做到这一点。

至于你的代码,它有很多错误。你的循环只会执行一次,并且只有当n等于i时才会执行。为什么在循环开始时将i初始化为1然后再初始化为0?为什么忽略i.add(...)的结果?为什么忽略ret.multiply(i)的结果?请记住,这些方法不会改变BI本身!

这包含了这些变化:

    BigInteger n = BigInteger.valueOf(10);
    BigInteger ret = BigInteger.ONE;
    for (BigInteger i = BigInteger.ONE; i.compareTo(n) <= 0; i = i.add(BigInteger.ONE)) {
        ret = ret.multiply(i);
    }
    System.out.println(ret);

答案 2 :(得分:2)

BigInteger对象是不可变的(意味着你无法改变它)。这样,它就像一个String对象。因此,要实现这一点,您需要更改行

ret.multiply(i);

ret = ret.multiply(i);

答案 3 :(得分:0)

public static BigInteger ifact(BigInteger n) {
  BigInteger ret = BigInteger.ONE;
  for (BigInteger i = BigInteger.ONE; i.compareTo(n) <= 0; i = i.add(BigInteger.ONE)) {
    ret = ret.multiply(i);
  }
  return ret;
}
  1. ret = ret.multiply
  2. i.compareTo(n)&lt; = 0
  3. BigInteger.ONE;