1
resposta

Estouro de memória no ex de fibonacci

A função do exercício está causando int overflow:

(defn soma-ate [n]
  (loop [contador 1 soma 0]
    (if (> contador n) soma)
    (recur (inc contador) (+ soma contador))))

Não consigo pegar o stack trace porque o terminal crasha.

Alguém saberia me explcicar o que está havendo?

1 resposta

Fala aí Bruno tudo bem?

O que acontece é que você fechou o parênteses na linha do if depois do soma.

(defn soma-ate [n]
  (loop [contador 1 soma 0]
    (if (> contador n) soma) ;nessa linha aqui
    (recur (inc contador) (+ soma contador))))

Esse parênteses que você fechou, e justamente o da instrução loop.

Com isso ao chegar no if ele verifica se o contador é maior que n (o que de fato não é a menos que você passe 1 para a função) e então ele volta para o loop.

E vai ficar fazendo essa verificação até estourar a memória.

O correto seria fechar esse parênteses depois do ultimo:

(defn soma-ate [n]
  (loop [contador 1 soma 0]
    (if (> contador n) soma
    (recur (inc contador) (+ soma contador)))))

Dessa forma se o contador for maior que n ele devolve a soma, do contrário ele faz a recursão.

Espero ter ajudado e bons estudos.