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 RESOLUCAO

Boa noite a todos,

Resolvi o exercício de Fibonacci, achei bem interessante e desafiador, entendi a fórmula e coloquei em prática com o LOOP, precisei de um pouco de ajuda da IA , porém a usei como um professor, fui fazendo, questionando e tirando dúvidas, porém fazendo o código e a lógica por mim mesmo. Acabei nessa descobrindo que posso usar EXIT WHEN no meio do LOOP o que foi de grande valia, e descobri por mim mesmo que devia colocar uma váriavel LIMITE para não entrar em LOOP INFINITO. Meu primeiro código estaria nessa situação, mas com ajuda e estudo consegui corrigir.

Então segue a procedure e a execução com o resultado.

SET SERVEROUTPUT ON
CREATE OR REPLACE PROCEDURE FIBONACCI 
(p_LIMITE IN NUMBER)
IS
    v_VALOR_A NUMBER := 0;
    v_VALOR_B NUMBER := 1;
    v_PROXIMO NUMBER;
BEGIN
    DBMS_OUTPUT.PUT_LINE('Sequência de Fibonacci até ' || p_LIMITE || ':');
    DBMS_OUTPUT.PUT_LINE(v_VALOR_A);
    DBMS_OUTPUT.PUT_LINE(v_VALOR_B);
    LOOP
    v_PROXIMO := v_VALOR_A + v_VALOR_B;
    EXIT WHEN v_PROXIMO > p_LIMITE;
    DBMS_OUTPUT.PUT_LINE(v_VALOR_A || ' + ' || v_VALOR_B || ' = ' || v_PROXIMO);
    v_VALOR_A := v_VALOR_B;
    v_VALOR_B := v_PROXIMO;
    
EXECUTE FIBONACCI(100);

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Olá, Adriano. Como vai?

Parabéns pela excelente resolução do desafio e pela postura ativa nos seus estudos! Utilizar a Inteligência Artificial como um tutor, fazendo perguntas para construir a própria lógica em vez de apenas copiar o código pronto, é a melhor forma de se desenvolver como programador.

O uso do EXIT WHEN no meio do bloco de repetição é uma excelente característica do PL/SQL, permitindo que você controle a saída do laço no momento exato em que a condição limite é atingida, evitando processamentos desnecessários.

Analisando o seu código e a imagem com o resultado da saída do script, sua lógica matemática para a sequência de Fibonacci ficou perfeita. No entanto, há um pequeno detalhe sintático bem no final do seu bloco de código que vale a pena ajustarmos para que sua procedure funcione corretamente no banco de dados.


Ajuste no Fechamento do Bloco PL/SQL

No trecho final do código que você compartilhou, você colocou a linha EXECUTE FIBONACCI(100); dentro do escopo da própria procedure.

Da forma como está estruturado, faltou fechar o laço com END LOOP; e finalizar a procedure com END FIBONACCI;. A chamada do comando EXECUTE (ou simplesmente EXEC) deve ser feita do lado de fora, no script de execução do banco.

Aqui está o ajuste necessário para corrigir a estrutura:

CREATE OR REPLACE PROCEDURE FIBONACCI 
(p_LIMITE IN NUMBER) IS
    v_VALOR_A NUMBER := 0;
    v_VALOR_B NUMBER := 1;
    v_PROXIMO NUMBER;
BEGIN
    DBMS_OUTPUT.PUT_LINE('Sequência de Fibonacci até ' || p_LIMITE || ':');
    DBMS_OUTPUT.PUT_LINE(v_VALOR_A);
    DBMS_OUTPUT.PUT_LINE(v_VALOR_B);
    
    LOOP
        v_PROXIMO := v_VALOR_A + v_VALOR_B;
        
        EXIT WHEN v_PROXIMO > p_LIMITE;
        
        DBMS_OUTPUT.PUT_LINE(v_VALOR_A || ' + ' || v_VALOR_B || ' = ' || v_PROXIMO);
        
        v_VALOR_A := v_VALOR_B;
        v_VALOR_B := v_PROXIMO;
    END LOOP; -- Fecha o laço de repetição
END FIBONACCI; -- Finaliza a procedure
/

Depois de compilar o código corrigido acima, aí sim você utiliza o comando de execução no seu terminal ou planilha de scripts:

EXEC FIBONACCI(100);

Por que sua lógica funcionou?

A ordem em que você atualizou as variáveis dentro do laço mostra que você captou muito bem o conceito de deslocamento de valores:

  • v_VALOR_A recebe o valor de v_VALOR_B
  • v_VALOR_B recebe o valor do v_PROXIMO

Esse mecanismo "passa o bastão" para a próxima iteração com maestria, garantindo a construção exata exibida na imagem da sua saída. A criação do parâmetro p_LIMITE foi uma excelente jogada de arquitetura para deixar o componente reutilizável para qualquer número.

Espero que possa ter lhe ajudado!