Guest User

Untitled

a guest
Dec 6th, 2013
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.54 KB | None | 0 0
  1. package ycombinator;
  2.  
  3. import java.math.BigInteger;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. import java.util.function.UnaryOperator;
  7.  
  8. public class App {
  9.     public static UnaryOperator<BigInteger> fibonacci(final UnaryOperator<BigInteger> operator) {
  10.         final BigInteger TWO = BigInteger.valueOf(2);
  11.         return (n) -> {
  12.             if (n.equals(BigInteger.ZERO)) return BigInteger.ZERO;
  13.             if (n.equals(BigInteger.ONE)) return BigInteger.ONE;
  14.             return operator.apply(n.subtract(BigInteger.ONE)).add(operator.apply(n.subtract(TWO)));
  15.         };
  16.     }
  17.     public static <T> UnaryOperator<T> ycombinator(final UnaryOperator<UnaryOperator<T>> operator) {
  18.         // cannot use lambda because we need 'this' reference...
  19.         return new UnaryOperator<T>() {
  20.             public T apply(T t) {
  21.                 return operator.apply(this).apply(t);
  22.             }
  23.         };
  24.     }
  25.     public static <T> UnaryOperator<T> memoizedYCombinator(final UnaryOperator<UnaryOperator<T>> operator) {
  26.         final Map<T, T> memoize = new HashMap<>();
  27.         return new UnaryOperator<T>() {
  28.             public T apply(T t) {
  29.                 if (! memoize.containsKey(t))
  30.                     memoize.put(t, operator.apply(this).apply(t));
  31.                 return memoize.get(t);
  32.             }
  33.         };
  34.     }
  35.     public static void main(String... args) {
  36.         BigInteger n = BigInteger.valueOf(1000);
  37.         UnaryOperator<BigInteger> fastFibonacci = memoizedYCombinator(t -> fibonacci(t));
  38.         UnaryOperator<BigInteger> slowFibonacci = ycombinator(t -> fibonacci(t));
  39.         // completes in <1 second
  40.         System.out.println(fastFibonacci.apply(n));
  41.         // never completes...
  42.         System.out.println(slowFibonacci.apply(n));
  43.     }
  44. }
Advertisement
Add Comment
Please, Sign In to add comment