/2010/08/01/learning-recursion

Reading Gödel, Escher, Bach opened my eyes to the idea that a huge amount of life is based off of this simple idea, and what a beautiful one it is -- the idea that something can be composed of itself.

I've since been on a kick trying to learn Scheme, which is a dialect of of Lisp known for its minimal standard library which IMO makes learning its fundamentals easier. I've tried starting off with Peter Siebel's Practical Common Lisp, but I found it as more of a book about learning the Lisp language than learning the underlying philosophy of Lisp.

My first serious run in with Lisp was due to me being a fan of Paul Graham's essays for awhile, and especially his book Hackers and Painters , and more recently because of Steve Yegge's blog posts and his strong advocacy of the Lisp language. I was also trying to work through Daniel Friedman's Essentials of Programming Languages and it assumes a working knowledge of Scheme in addition to being pretty academic, so I figured I'd try and start off learning the fundamentals of Scheme before I tried to get any further.

With that said, what I'm reading now is The Little Schemer, also by Daniel Friedman. This book's style is a complete turnaround from Essentials; it assumes no experience programming, and does a great job of going through recursive problems step by step. It's also a pretty short read. I'd highly recommend it to anyone that feels they're missing some background in solving recursive problems.

On a side note: It's a shame that a lot CS schools have either not advocated learning a Lisp to begin with or are phasing them out (MIT, I'm looking at you). I've never really understood the argument that Python is the best language for people that have never programmed before; I've found in practice that Python has as many quirks ("closures", etc) as most other languages I enjoy programming in, but I would agree it has a strong resemblance to pseudocode, which implies something good about it I suppose.

If I could be taught over again, I'd much rather have someone teach me the core CS concepts in an extremely pure language like Scheme than trying to teach that concurrently with the syntax and quirks of C/C++, which is what for the most part went on at the University of Michigan. I believe this is a result of trying to serve many needs at once (practicality, abundance of EE/CE majors). Ideally these would be taught separately.