Es pot demostrar que la recurrència un+2=5 × un+1 − 6 × un, amb u0 = 0 i u1 = 1 és tal que per a tot n, un = 3n − 2n.
L’estudiant que no ho sap, però vol conèixer el valor d’un per a qualsevol n, podria ser tan ingenu d’implementar la següent funció d’una manera molt ineficient, fent servir la definició matemàtica:
(defn recurrencia [n]
(cond
(or (= n 0) (= n 1)) n
:else (let [rm1 (recurrencia (dec n))
rm2 (recurrencia (dec (dec n)))]
(-' (*' 5 rm1) (*' 6 rm2)))))
Passeu aquesta funció a continuation passing style per obtenir-ne la versió recursiva final. Anomeneu-la recurrencia-cps.
Després, trampolinitzeu recurrencia-cps per evitar d’obtenir l’error de Stack Overflow. Anomeneu-la recurrencia-t.
Observacions
Cal que envieu un fitxer amb la definició de les dues funcions recurrencia-cps i recurrencia-t.
Input
(recurrencia-cps 5 identity) (recurrencia-cps 10 identity) (recurrencia-cps 15 identity) (recurrencia-t 5) (recurrencia-t 10) (recurrencia-t 15) (recurrencia-t 20)
Output
211 58025 14316139 211 58025 14316139 3485735825