CREATE OR REPLACE PACKAGE ackermann IS
/*   File: ackermann-memo.pls

     Explicit memo-fn version of ackermann's function
  
     Without memorization:
            Ackermann(3,10) = 8189
            44698325 calls

     With memorization:
            Ackermann(3,10) = 8189
            20481 calls, 4103 cache hits
   
     (functional languages can do this transparently by currying with
      the memo() function, eg "let ackermann = memofn(ackermann);" )
*/
«  Headers  »
TYPE param2 IS TABLE OF PLS_INTEGER INDEX BY PLS_INTEGER; TYPE memo2d IS TABLE of param2 INDEX BY PLS_INTEGER; FUNCTION memofn(x IN PLS_INTEGER, y IN PLS_INTEGER) RETURN PLS_INTEGER; END ackermann;

CREATE OR REPLACE PACKAGE BODY ackermann IS cache memo2d; « memofn »
END;
set serveroutput on BEGIN DBMS_Output.put_line('Ackermann(3, 10) = ' || ackermann.memofn(3, 10)); END;