Нахождение факториала с использованием рекурсии с классом BigInteger

Итак, рассмотрим следующий программный сегмент! Я попытался использовать базовую функцию рекурсии для определения факториала числа, но теперь использую класс BigInteger.

public static BigInteger fact(int a)
{
    BigInteger factorial = BigInteger.ONE;

    BigInteger factz = BigInteger.ONE;

    if(a == 1)
    {
        return factorial;
    }

    else
    {
        return factz.multiply(fact(a-1));
    }
}

Поэтому, когда я пытаюсь реализовать это в программе, она возвращает результат как 1. Это потому, что объекты BigInteger неизменяемы? Или я что-то здесь упускаю?


person Srikanta R Gunner Somayaji    schedule 28.07.2013    source источник


Ответы (6)


В коде есть ошибка, вы должны поставить

  BigInteger factz = BigInteger.valueOf(a);

вместо BigInteger factz = BigInteger.ONE;

person Dmitry Bychenko    schedule 28.07.2013
comment
ой ладно... это было действительно глупо с моей стороны! Спасибо чувак! вот еще что, в остальном все нормально? - person Srikanta R Gunner Somayaji; 28.07.2013
comment
@SrikantaRGunnerSomayaji: 0! = 1, 1! = 1, 2! = 2, 3! = 6, 4! = 24 и т. д., так что давайте проверим: 0! вообще не работает, 1!, 2!, 3!... работает. Измените условие на if (a == 0), и все будет в порядке - person Dmitry Bychenko; 28.07.2013

Псевдокод вычисления факториала рекурсивно выглядит так:

function factorial(n) {
   if (n == 0)
      return 1;
   else
      return n * factorial(n - 1);
}

Реализация с помощью BigInteger будет:

public static BigInteger factorial(BigInteger n) {
    if (n.equals(BigInteger.ZERO))
        return BigInteger.ONE;
    else
        return n.multiply(factorial(n.subtract(BigInteger.ONE)));
}

public static void main(String[] args) {
    System.out.println(factorial(new BigInteger("100")));
}

Вывод будет:

93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

Примечание: рекурсия занимает слишком много памяти, если n велико. В этом случае лучше использовать какой-либо итерационный алгоритм для вычисления факториала.

person DimaSan    schedule 28.12.2016

Я не понимаю актуальности локальных переменных, и вам нужно использовать BigInteger.valueOf(a).

Ваш метод может быть выражен всего одной строкой:

public static BigInteger fact(int a) {
    return a == 1 ? BigInteger.ONE : BigInteger.valueOf(a).multiply(fact(a - 1));
}
person Bohemian♦    schedule 28.07.2013

Найдите факториал с рекурсией любого числа и без нее.

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.println("Enter no to find factorial :");
    BigInteger inputNo1 = input.nextBigInteger();
    System.out.println("With recursion    " + inputNo1 + "! Factorial = " + (factorial(inputNo1.intValue())));
    System.out.println("Without recursion " + inputNo1 + "! Factorial = " + (findFactorial(inputNo1)));
}

private static String findFactorial(BigInteger inputNo1) {
    int counter;
    BigInteger increment = new BigInteger("1");
    BigInteger fact = new BigInteger("1");
    for (counter = 1; counter <= inputNo1.longValueExact(); counter++) {
        fact = fact.multiply(increment);
        increment = increment.add(BigInteger.ONE);
    }
    return String.valueOf(fact);
}

public static BigInteger factorial(int number) {
    if (number <= 1)
        return BigInteger.ONE;
    else
        return factorial(number - 1).multiply(BigInteger.valueOf(number));
}
person Buddhesh Baraiya    schedule 28.12.2016

Мое решение для поиска факториала с использованием рекурсии с классом BigInteger

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.*;
import java.util.*;

class Main {
    public static String factorial(int n,String s){
        if(n>0){
            BigInteger fact = new BigInteger(s);
            fact = fact.multiply(new BigInteger(n + ""));
            return factorial(n-1,fact.toString());
        }
        else{
            return s.toString();
        }
    }

    public static void main(String args[] ) throws Exception {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = br.readLine();
            int n = Integer.parseInt(line);
            if(n==0)
            System.out.println("Factorial is 0");
            else{
            String s = factorial(n,"1");
            System.out.println("Factorial is " + s);
            }
    }
}

Вывод снимка экрана для приведенного выше кода: Снимок экрана для приведенного выше кода

person Nandha Kumar Singaram    schedule 23.08.2017

Взгляните на это:

 public static BigInteger fact(BigInteger a)
      {

          if(a.intValue()==1||a.intValue()==0)
          {
              return BigInteger.ONE;
          }

          else
          {
              return a.multiply(fact(a.subtract(BigInteger.ONE)));
          }
      }

Изменения следующие:
 – Включить 0!=1
 – Поскольку функция fact возвращает BigInteger, ее аргумент должен быть BigInteger< /em> тоже!

person dsharew    schedule 28.07.2013
comment
Почему аргумент должен быть того же типа, что и тип возвращаемого значения? Не имеет никакого смысла. - person JB Nizet; 28.07.2013
comment
Потому что он вызывает факт с той же локальной переменной! - person dsharew; 28.07.2013
comment
Да, и что? В чем проблема с вызовом fact(a - 1), если a является int, а fact() принимает int в качестве аргумента? - person JB Nizet; 28.07.2013