Clojure - La Recurrència amb Trampolí W83336


Statement
 

pdf   zip

Es pot demostrar que la recurrència un+2=5×un+16×unu_{n+2}=5 \times u_{n+1} - 6 \times u_{n}, amb u0=0u_0 = 0 i u1=1u_1 = 1 és tal que per a tot nn, un=3n2nu_n = 3^n - 2^n.

L’estudiant que no ho sap, però vol conèixer el valor d’unu_n per a qualsevol nn, 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.

Public test cases
  • 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
    
  • Information
    Author
    Jordi Delgado
    Language
    Catalan
    Official solutions
    Clojure
    User solutions
    Clojure