Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

MINHA RESOLUÇÃO

Boa Tarde a todos,

Primeiramente corrigi o FOR , tratei a Interação 1 e 2 para que trouxessem corretamente os valores de fibonacci, caso fosse uma delas a escolhida pelo usuário, após isso fiz o FOR para quando a variável for maior que 2 fazer a contagem, iniciando o contador em 3, já que começa a partir da terceira interação o FOR.

CREATE OR REPLACE PROCEDURE NUMEROS_FIBONACCI (p_INTERACOES IN FLOAT, p_NUMEROFIBO OUT FLOAT)
IS
   v_FIBO1 FLOAT := 0;
   v_FIBO2 FLOAT := 1;
   v_FIBO_ATUAL FLOAT := 0;
   v_INTERACOES FLOAT := 1;
BEGIN
   IF p_INTERACOES = 1 THEN
      v_FIBO_ATUAL := 0;
   ELSIF p_INTERACOES = 2 THEN
      v_FIBO_ATUAL := 1;
   ELSIF p_INTERACOES > 2 THEN
      v_FIBO_ATUAL := 0;
      FOR v_CONTADOR IN 3.. p_INTERACOES LOOP
         v_FIBO_ATUAL := v_FIBO1 + v_FIBO2;
         v_FIBO1 := v_FIBO2;
         v_FIBO2 := v_FIBO_ATUAL;
      END LOOP;
   END IF;
   p_NUMEROFIBO := v_FIBO_ATUAL;
END;

Após isso fiz os testes e os resultados , tanto das interações 1 e 2 quanto da 3 em diante foram corretos.

SET SERVEROUTPUT ON;
DECLARE
   v_parametro_entrada FLOAT := 1;
   v_resultado_saida   FLOAT;
BEGIN
   NUMEROS_FIBONACCI
   (p_INTERACOES => v_parametro_entrada, 
      p_NUMEROFIBO => v_resultado_saida);
   DBMS_OUTPUT.PUT_LINE('Posição na sequência: ' || v_parametro_entrada);
   DBMS_OUTPUT.PUT_LINE('Número de Fibonacci:  ' || v_resultado_saida);
END;

1 resposta

Olá, Adriano! Como vai?

Parabéns pela resolução da atividade!

Vi que você explorou a procedure para calcular números da sequência de Fibonacci com PL/SQL, utilizou muito bem o FOR para controlar as interações e ainda compreendeu a importância da condicional para tratar corretamente os casos iniciais (1 e 2) antes de avançar para os demais.

Uma dica interessante para o futuro é tornar a procedure mais flexível, permitindo retornar não apenas o valor da posição escolhida, mas também toda a sequência até aquele ponto. Assim:

CREATE OR REPLACE PROCEDURE SEQUENCIA_FIBONACCI (p_INTERACOES IN NUMBER) IS
   v_FIBO1 NUMBER := 0;
   v_FIBO2 NUMBER := 1;
   v_FIBO_ATUAL NUMBER := 0;
BEGIN
   DBMS_OUTPUT.PUT_LINE('Sequência de Fibonacci até ' || p_INTERACOES || ' posições:');
   FOR v_CONTADOR IN 1..p_INTERACOES LOOP
      IF v_CONTADOR = 1 THEN
         v_FIBO_ATUAL := v_FIBO1;
      ELSIF v_CONTADOR = 2 THEN
         v_FIBO_ATUAL := v_FIBO2;
      ELSE
         v_FIBO_ATUAL := v_FIBO1 + v_FIBO2;
         v_FIBO1 := v_FIBO2;
         v_FIBO2 := v_FIBO_ATUAL;
      END IF;
      DBMS_OUTPUT.PUT_LINE(v_FIBO_ATUAL);
   END LOOP;
END;

Isso faz com que o usuário visualize toda a sequência até a posição desejada, não apenas o último valor.

Se quiser aprofundar ainda mais, algumas boas práticas são:

  • Documentação interna: adicionar comentários explicando cada parte da lógica.
  • Tipagem adequada: usar NUMBER em vez de FLOAT para maior precisão em cálculos inteiros.
  • Generalização: permitir que a procedure seja chamada em diferentes contextos, como relatórios ou cálculos auxiliares.

Ah, uma pergunta: você acha que retornar toda a sequência até a posição escolhida ajuda mais na compreensão da lógica de Fibonacci ou prefere manter apenas o valor final para simplificar o resultado?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!