* Dynamic Programming and the related concept of Memoization.
* Recursion - most complex problems seem to have a recursive solution which you can actually implement in a language like Scheme or Haskell that does not limit stack size.
* State machines.
* Monte Carlo methods.
* Unification - see SICP.
* Hand-rolled parsers instead of regular expressions for debug-ability and readability.