FATORIAL

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
druffes
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 31
Registrado em: Sex, 26 Jan 2007 6:23 pm
Localização: Campo Mourão - PR

Estou tentando montar uma lógica onde eu lance um numero e essa lógica me forneça o fatorial deste numero....
Estou tentando usar este comando mas não esta dando certo, se alguém puder me ajudar eu agradeço muito....

Selecionar tudo

DECLARE
	VA_FATORIAL NUMBER(10) :='&NUMERO';
   	VA_FINAL    NUMBER(1)  := 1;
	VA_MULT     NUMBER(10) := VA_FATORIAL -1;
BEGIN
   LOOP
     	EXIT WHEN VA_FATORIAL=VA_FINAL 
	OR VA_FATORIAL * VA_MULT;
     	VA_MULT := VA_FATORIAL-1;
   END LOOP;
END;

vocês tb devem ter notados que eu abri alguns tópicos é que estou fazendo um curso e comecei ver PL/SQL a duas aulas, por isso tantas dúvidas espero não estar encomodando e quem sabe mas para frente possa contribuir com o forum tirando a dúvida de outros que precisem....
Agradço muito pela ajuda que estão me dando....OBRIGADO
druffes
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 31
Registrado em: Sex, 26 Jan 2007 6:23 pm
Localização: Campo Mourão - PR

Tentei usar este outro comando, mas tb da erro....

Selecionar tudo

DECLARE
   VA_FATORIAL   NUMBER(10)  :='&NUMERO';
   VA_FINAL      NUMBER(10)  := 1;
   VA_MULT       NUMBER(10)  := VA_FATORIAL -1;
   VA_RESULTADO  NUMBER(10);
BEGIN
   LOOP
     EXIT WHEN VA_FATORIAL = VA_FINAL;
     VA_FATORIAL * VA_MULT := VA_RESULATDO;
   END LOOP;
END;
[/i][/b]
ARF
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 41
Registrado em: Qui, 03 Ago 2006 9:30 am
Localização: Criciúma - SC

ARF
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 41
Registrado em: Qui, 03 Ago 2006 9:30 am
Localização: Criciúma - SC

Desculpe aí, parece que o link mudou.

Mas o que estava no link é isso aí:

Selecionar tudo

Create an object to do the cumulative multiplication


create or replace type cumulative_mult_type as object  (     total varchar2(4000),     static function          ODCIAggregateInitialize(sctx IN OUT cumulative_mult_type )          return number,     member function          ODCIAggregateIterate(self IN OUT cumulative_mult_type ,                               value IN NUMBER)          return number,     member function          ODCIAggregateTerminate(self IN cumulative_mult_type ,                                 returnValue OUT  NUMBER,                                 flags IN number)          return number,     member function          ODCIAggregateMerge(self IN OUT cumulative_mult_type,                             ctx2 IN cumulative_mult_type )          return number  );


Define the body


create or replace type body cumulative_mult_type  is  static function ODCIAggregateInitialize(sctx IN OUT cumulative_mult_type)  return number  is  begin      sctx := cumulative_mult_type( 1 );      return ODCIConst.Success;  end;  member function ODCIAggregateIterate(self IN OUT cumulative_mult_type,                                       value IN NUMBER )  return number  is  begin      self.total := self.total * value;      return ODCIConst.Success;  end;  member function ODCIAggregateTerminate(self IN cumulative_mult_type,                                         returnValue OUT NUMBER,                                         flags IN number)  return number  is  begin      returnValue := self.total;      return ODCIConst.Success; end; member function ODCIAggregateMerge(self IN OUT cumulative_mult_type,                                    ctx2 IN cumulative_mult_type)  return number  is  begin      self.total := self.total * ctx2.total;      return ODCIConst.Success;  end;end;


Create the aggregate function


CREATE or replace  FUNCTION factorial(input NUMBER )  RETURN NUMBER  PARALLEL_ENABLE AGGREGATE USING cumulative_mult_type;


Populate the table


SQL> create table a ( col1 NUMBER );Table created.SQL> INSERT INTO a VALUES (1);1 row created.SQL> INSERT INTO a VALUES (2);1 row created.SQL> INSERT INTO a VALUES (3);1 row created.SQL> INSERT INTO a VALUES (4);1 row created.


Now, run the factorial function


SQL> SELECT factorial( col1 ) from a;FACTORIAL(COL1)---------------             24
[/code]
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Tem razão:
Eu achei o seguinte código que usa funções analíticas pra gerar o fatorial:

Selecionar tudo

select rownum,
exp(sum(ln(rownum)) over (order by rownum)) Factorial
from user_objects
where rownum < 21;
druffes
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 31
Registrado em: Sex, 26 Jan 2007 6:23 pm
Localização: Campo Mourão - PR

Eu entendi mais ow menos o que vocês mandaram, o problema é que preciso, conseguir montar uma lógica que me pessa um numero e eu inserindo este numero ela me forneça o fatorial do mesmo......
Acho que é mais ow menos por esse caminho.....

Selecionar tudo

DECLARE
   VA_NUMERO     NUMBER(10)  :='&NUMERO';
   VA_FINAL      NUMBER(10)  := 1;
   VA_MULT       NUMBER(10)  := VA_NUMERO -1;
   VA_RESULTADO  NUMBER(10)  := VA_MULT;
   VA_FATORIAL   NUMBER(10);
BEGIN
     EXIT WHEN VA_NUMERO = VA_FINAL LOOP;
     VA_NUMERO * VA_MULT := VA_RESULTADO;
     VA_RESULTADO*VA_MULT :=VA_FATORIAL;
   END LOOP;
END;
/
[/i]Mas não estou conseguindo fazer com que as funções se encaixem se alguém souber onde estou errando e puder me ajudar ficaria muito grato.....
Obrigado....
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Seria isso brow?

Selecionar tudo


DECLARE
  
  v_teste NUMBER := 0;
  
  FUNCTION fun_fatorial (p_nro IN NUMBER)
  RETURN NUMBER 
  IS 
    v_nro NUMBER := 1;
  BEGIN 
    FOR x IN 1..p_nro
    LOOP
      v_nro := v_nro * x;
    END LOOP;
    RETURN v_nro;
  END;
  
BEGIN
  v_teste := fun_fatorial(5);
  dbms_output.put_line('Fatorial: '||v_teste);
END;  

Abraços,

:-o
lfarah
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Seg, 12 Mar 2007 5:16 pm
Localização: são Paulo - SP

Pra deixar mais ou menos como você fez :

Selecionar tudo

DECLARE 
   VA_FATORIAL NUMBER(10) := 5; -- AQUI você ENTRA COM O NUMERO QUE QUER CALCULAR O FATORIAL
   FAT    	   NUMBER(10) := 1;
BEGIN 
   WHILE VA_FATORIAL > 1 LOOP
   FAT := VA_FATORIAL * FAT; 
   VA_FATORIAL := VA_FATORIAL - 1;
   END LOOP;
   dbms_output.put_line('FATORIAL -> '||FAT);
 END; 

-- acho qfunciona :-)
druffes
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 31
Registrado em: Sex, 26 Jan 2007 6:23 pm
Localização: Campo Mourão - PR

Muito obrigado pela ajuda de todos que postaram suas idéias e dicas.
Fiz desta forma e deu certo:

Selecionar tudo

DECLARE
	VA_NUM NUMBER(3) :='&NUMERO';
	VA_FAT NUMBER := VA_NUM;
BEGIN
	FOR VA_MULT IN 2..VA_NUM-1 LOOP
	  VA_FAT := VA_FAT * VA_MULT;
	END LOOP;
	DBMS_OUTPUT.PUT_LINE(' O FATORIAL DE '||VA_NUM||' É: '||VA_FAT);
END;
Vlw pessoal....[/b]
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Pra quem gosta de RECURSIVIDADE (eu não, hehehe), aí vai:

Selecionar tudo

SQL> create or replace function thomas_factorial( n binary_double) return binary_double is
  2  begin
  3    if n<=1 then
  4      return 1;
  5    else
  6      return n * thomas_factorial (n-1);
  7    end if;
  8  end;
  9  /

Function created.

Exemplo:

Selecionar tudo

SQL> select thomas_factorial ( 3 ) from dual;

THOMAS_FACTORIAL(3)
-------------------
           6.0E+000

SQL> select thomas_factorial( 4 ) from dual;

THOMAS_FACTORIAL(4)
-------------------
           2.4E+001

SQL> select thomas_factorial ( 10 ) from dual;

THOMAS_FACTORIAL(10)
--------------------
          3.629E+006

SQL> 
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes