Clojure - Subfactorial amb Trampolí V89940


Statement
 

pdf   zip

Es defineix la funció !n (CAP, tema 1, plana 25), de la següent manera (!n s’anomena subfactorial):

!0=1!1=0!2=1!n=(n1)×(!(n1)+!(n2)) si n>2\begin{equation} \begin{split} !0 & = 1 \\ !1 & = 0 \\ !2 & = 1 \\ !n & = (n-1) \times (!(n-1) + !(n-2)) \text{ si $n > 2$} \end{split} \end{equation}

Podem implementar-la, de manera molt ineficient, fent servir la definició matemàtica:

(defn subfact_recursiva [n]
   (cond
      (or (= n 0) (= n 2))   1
      (= n 1)                0
      :else (*' (dec n)
                (+' (subfact_recursiva (dec n))
                    (subfact_recursiva (- n 2))))))

Passeu aquesta funció a continuation passing style per obtenir-ne la versió recursiva final. Anomeneu-la subfact-cps.

Després, trampolinitzeu subfact-cps per no obtenir l’error de Stack Overflow. Anomeneu-la subfact-t.

Observacions

Cal que envieu un fitxer amb la definició de les dues funcions subfact-cps i subfact-t.

Public test cases
  • Input

    (subfact-cps 5 identity)
    (subfact-cps 10 identity)
    (subfact-cps 15 identity)
    (subfact-t 5)
    (subfact-t 10)
    (subfact-t 15)
    (subfact-t 20)
    

    Output

    44
    1334961
    481066515734
    44
    1334961
    481066515734
    895014631192902121
    
  • Information
    Author
    Jordi Delgado
    Language
    Catalan
    Official solutions
    Clojure
    User solutions
    Clojure