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

Dúvida Sobre Resposta do Exercício Recursão de Cauda

Boa tarde!

A resposta dada no exercício sobre recursão de cauda não seria referente à otimização da recursão de cauda? Em meu entendimento qualquer função que chama ela mesma em sua última instrução implementa uma recursão de cauda.

3 respostas

Olá Giovani,

nem todas as recursões que chamam a própria função são implementadas como uma recursão de cauda no Clojure. Um jeito fácil de ver isso é notar que o código a seguir:

(defn funcao-loop [tamanho]
    (do
        (print "O tamanho é ")
        (println tamanho)
        (funcao-loop (inc tamanho))
    )
)

dá overflow no número 5705 (na minha máquina), quando eu chamo (funcao-loop 1)

O tamanho é 5703
O tamanho é 5704
StackOverflowError   clojure.lang.PersistentHashMap$BitmapIndexedNode.index (PersistentHashMap.java:677)
O tamanho é 5705

mas o código

(defn funcao-loop [tamanho]
    (do
        (print "O tamanho é ")
        (println tamanho)
        (recur (inc tamanho))
    )
)

roda indefinidamente.

Isso acontece pois o recur instrui o compilador do Clojure a implementar a recursão de cauda corretamente, ao passo que apenas chamar a recursão na posição correta não implica na geração de um bytecode com a recursão de cauda.

Entendi os conceitos. Quando a última chamada da função é uma chamada para ela mesma existe aí uma recursão de cauda. A jogada acontece quando se utiliza o recur. Nesse caso o compilador será instruído a otimizar essa recursão convertendo ela para um laço ao gerar o bytecode. Acho que é o que afirmei no começo mesmo, a nível de conceito.

solução!

É exatamente isso.