Java: простая функция рекурсии возвращает только 1 - PullRequest
1 голос
/ 27 сентября 2010

Как ни странно, это мое первое 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»?

EDIT : я думаю, что хотел установить ret как n, это может быть или ... может и не быть.

Ответы [ 4 ]

5 голосов
/ 27 сентября 2010

В ответ на ваш вопрос "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);
5 голосов
/ 27 сентября 2010

Попробуйте изменить

ret.multiply(i);

до

ret = ret.multiply(i);
2 голосов
/ 27 сентября 2010

Объект BigInteger является неизменным (то есть вы не можете его изменить). Таким образом, это как объект String. Итак, чтобы это работало, вы бы хотели изменить свою строку

ret.multiply(i);

до

ret = ret.multiply(i);
0 голосов
/ 27 сентября 2010
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) <= 0 </li>
  3. BigInteger.ONE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...