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.
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.
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.
É exatamente isso.