Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida no Ex. 2 da Aula 5 - Funções recursivas e recursão de cauda

De modo geral não entendi a forma do loop e o fib utilizando essa abordagem. Meus principais pontos de duvida são: Na afirmativa: "Quando numero é igual x então, o valor final está em b." Como Assim?

Como o loop acontece? a e b são incrementadas?

Em "(recur b (+ a b) (inc numero))" não estamos chamando a função fib novamente? logo ela interpreta os outros parâmetros: (+ a b) (inc numero)

3 respostas
solução!

Oi Luiz,

A resposta é essa, certo?

(defn fib[x]
    (loop [a 1 b 1 numero 2]
        (if 
            (= numero x) b
            (recur b (+ a b) (inc numero))
        )
    ))

O melhor jeito de entender é desenhar uma tabela no papel, e ir acompanhando. Veja, a vale 1, b vale 1 e numero vale 2. O número indica qual o número de fibonnaci que estamos.

Aí, vá para a recursão. Ela chama a função passando b, a+b, n+1. Ou seja:

a - b - numero
1 - 1 - 2
1 (antigo b) - 2 (a+b) - 3
2 - 3 - 4
3 - 5 - 5
5 - 8 - 6

Repare que "b" sempre tem o número de fibonacci correspondente ao número.

Entendeu?

Oi Luiz, em relação a execução, a função "loop" é um atalho para uma chamada recursiva e funciona como o alvo da função "recur", por isso os parâmetros passados são os do "loop" e não os da função em si.

Como é mostrado na documentação:

https://clojuredocs.org/clojure.core/loop

Entendi a execução conforme a tabela.

Ainda estava confuso, pois assumi que a função "recur" estava fazendo referencia a "fib[x]" mas ele na verdade representa a função "loop [a 1 b 1 numero 2]". Imagino que a função que o parâmetro para a função "fib[x]" seja sempre o primeiro parâmetro em "recur b (+ a b) (inc numero)".