Потому что возврат не является работоспособным?

Я нуждаюсь в factorial 100, понимаю, что я нуждаюсь в том, чтобы искать другую альтернативу, они могли бы помогать?

public class Main {
    public static void main(String[] args) {        
        System.out.println(factorial(100));
    }

    public static long factorial(long num) {        
        if (num <= 1) 
            return num;

        return num * factorial(num-1);
    }
}
3
задан 12.08.2017, 05:00
3 ответа

Проблема recursi¦n появляется, когда он делает cÃ: lculos уже вычисленные заблаговременно, recursi¦n вычисляет и повторяет вычисления до того, чтобы прибывать в базовый случай.

Лучше это объяснил с изображением, factorial (3) и factorial (4) с возвратом:

introducir la descripción de la imagen aquí

Согласно изображению, чтобы получать factorial(3), вычисляет factorial(2) и factorial(1), потом чтобы получать factorial(4), также считают factorial(2) и factorial(1), тогда возврат повторяет вычисления, это очень плохое для времени выполнения .

Â: Из-за qué не сохранять результаты и использовать их, когда он будет нуждаться? Я схватил уже не calcularÃ: n снова и снова, только ты считаешь однажды и я заношу в список.

Код, который я выставляю только, считает однажды и сохраняет их, для, когда он будет нуждаться, таким образом я вновь не считаю снова и снова.

import java.util.*;
import java.lang.*;
import java.io.*;

public class Main {
    public static void main(String[] args) {
        System.out.println(factorial(100));
    }

    public static double  factorial(int  n) {
        double  result[]=new double  [1000] ;          
                result[0] = 1;
                for (int i = 1; i <= n; ++i) {
                    result[i] = i * result[i - 1];
                }
                return result[n];
    }
}

согласно комментариям, хорошим наблюдениям!!!:

Iterativo или перекурсив проблема, о которой ты упоминаешь dar¦ - в так или иначе, и которая конечно не применяется в этом случае. Ничего не стоит хранить промежуточные результаты, если потом откажутся все, кроме от último

import java.util.*;
    import java.lang.*;
    import java.io.*;

    public class Main {
      double  result[]=new double  [1000] ;
      public Main(){
         result[0] = 1;
      }
        public static void main(String[] args) {
            System.out.println(factorial(100));
        }

        public static double  factorial(int  n) {

                    if(!result[n]){
                     for (int i = 1; i <= n; ++i) {
                        result[i] = i * result[i - 1];
                     }
                     return result[n];
                    }else{
                      return result[n];
                    }
        }
    }
2
ответ дан 24.11.2019, 06:47
  • 1
    Memoization.... –   12.08.2017, 06:23
  • 2
    @Luiggi Мендоса Х точно + динамическое программирование, –  x-rw 12.08.2017, 06:24
  • 3
    Он мне не кажется programació n diná слюда полностью, только часть наполовину memoization. –   12.08.2017, 06:25
  • 4
    но в случае factorial, только умножь каждое число на предыдущего однажды. или я терялся чего-то. проблема находится в поисках дорожек. объяснение проблемы memoization хорошее. решение в этом случае приходит с другой стороны. –  gbianchi♦ 12.08.2017, 08:41
  • 5
    Iterativo или перекурсив проблема, о которой ты упоминаешь darí в так или иначе, и что конечно не применяется в этом случае. Ничего не стоит хранить промежуточные результаты, если потом откажутся все, кроме от ú ltimo. –  Carlos Muñoz 12.08.2017, 10:37

Проблема не возврат но стоимость factorial 100 слишком большая, чтобы входить в биты одного long, уже состойте в Java или другом языке programaci¦n, в чем он манипулировал этим типом информации. N¦tese, что стоимость mÃ: ximo один long в Java это 0x7fffffffffffffffL или 9223372036854775807

В Java, это может быть решенным используя BigInteger, хотя он уменьшает результат aplicaci¦n.

Пример: Последованные

public BigInteger factorial(int n) {
    return (n < 0) ? new BigInteger(String.valueOf(n)) :
        (n == 0 || n == 1) ? BigInteger.ONE :
        new BigInteger(
                String.valueOf(n))
            .multiply( factorial(n-1) );
}

:

System.out.println(factorial(100));
//imprime 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
8
ответ дан 24.11.2019, 06:47
  • 1
    Побей козырем для n = 0 –  Carlos Muñoz 12.08.2017, 05:02
  • 2
    @CarlosMuñ oz исправленный используя ту же ló gica OP –   12.08.2017, 05:03
  • 3
    0! == 1, твой có я говорю, что он бросает 0 –  Carlos Muñoz 12.08.2017, 05:12
  • 4
    @CarlosMuñ oz я не сделал это формальным, одинокий я это оставил с ló gica OP. –   12.08.2017, 06:23
  • 5
    @LuiggiMendozaJ ты не отвечаешь вопрос, ¿ Потому что возврат не является работоспособным? –  x-rw 12.08.2017, 19:10

C¦digo iterativo уже ten¦-схвати это ты сами, единственный hac¦ - в отсутствие менять тип информации long в double, так как factorial, который ты искал, - слишком большой для long

public class Main {
    public static void main(String[] args) {
       System.out.println(factorial(100));
    }

    public static double factorial(double num) {
       double suma = 1; 

       while(num > 1) {
           suma *= num;
           num --;
       }

       return suma;
    }
}

Это, возвращает: 9.332621544394418E157

2
ответ дан 24.11.2019, 06:47
  • 1
    Спасибо уже я понимаю –  Romulo Gallegos 12.08.2017, 05:02
  • 2
    @CarlosMuñ oz ты не отвечаешь вопрос, ¿ Потому что возврат не является работоспособным? –  x-rw 12.08.2017, 19:10