This preview has intentionally blurred sections. Sign up to view the full version.
View Full Document
Unformatted text preview: (* Straightforward implementation of fib has exponential number of * recursive calls. Requires n nonnegative. *) let rec fib(n) = if n<2 then 1 else fib(n1) + fib(n2) (* However most of these recursive calls share common subproblems  * there are only n distinct subproblems to solve, one for each value * of n. Idea of memoization is to keep track of these results as so * they can be looked up rather than recomputed. *) let fibm(n) = let memo: int option array = Array.create (n+1) None in let rec f_mem(n) = match memo.(n) with Some result > result (* computed already! *)  None > let result = if n<2 then 1 else f_mem(n1) + f_mem(n2) in memo.(n) < (Some result); (* record in table *) result in f_mem(n) (* Maximum weight independent set in a tree, office party optimization * problem. *) module Unmemoized = struct type tree = Empty  Node of int * tree * tree (* Returns optimum fun for t. *) let rec party(t) = max (party_in t) (party_out t) (* Returns optimum fun for t assuming the root node of t * is included. *) and party_in(t) = match t with Empty > 0  Node(v,left,right) > v + party_out(left) + party_out(right) (* Returns optimum fun for t assuming the root node of t * is excluded. *) and party_out(t) = match t with Empty > 0  Node(v,left,right) > party(left) + party(right) end e module Memoized = struct (* This version memoizes the optimal fun value for each tree node....
View
Full
Document
This note was uploaded on 10/25/2009 for the course PHYS 2214 at Cornell.
 '07
 GIAMBATTISTA,A

Click to edit the document details