There are quite a few tutorials on the web about recursive functions - I've even posted one myself - that use the old standby Factorial of 5 explanation. It's a great example and illustrates the concept very well.

OK, fine, so we can use recursive functions to do factorials, but there are calculators and pre-written functions that handle that, so why do I need to understand recursion?

Minesweeper opening grid

Opening game

Minesweeper after clicking a square

After first move

What might help is another less common real-world example. Let's take a look at Microsoft's® standby game, Minesweeper®. It's a game that most people are at least somewhat familiar with. This quick tutorial will hopefully help you see how recursion works in the code behind this great little game.

Minesweeper starts it's beginner game with a 9x9 grid of squares. When the user clicks on the center square (red "X"), the program must look at all 8 adjacent squares (in yellow) and determine how many mines surround that square. It happens that no matter where you click first, the eight surrounding squares will not contain mines. It's just the way the game is programmed. Live with it. However, many of those squares may have one or more mines surrounding them. Now we begin to get recursive...

Here's how it works:

The eight squares surrounding the red "X" each have squares surrounding them. Each one of them must be examined in turn to see how many mines surround them. In the case of our example, the square directly below the red "X" had zero mines surrounding it. Now the program must check each of the squares surrounding that square.

So... first we must have a function that checks surrounding squares for mines. It could happen that one of the squares we're checking needs to have its surrounding squares checked for mines. The same function that checks adjacent squares for mines needs to include a function call to check adjacent squares for mines - it may need to call itself.

The code is a bit more involved than what we can go into in a short blog, but here is a recap of the concept:

If one started on the square with the black dot, coordinates (5,3) in an (x,y) grid, one would need to check square (4,2) to see if it's a bomb. If it isn't, one would need to see how many bombs surround (4,2), so the program would call itself with new coordinates. This time, the program would check (3,1) to see if it's a bomb. If it isn't, the program would need to see how many bombs surround (3,1), so the program would call itself with new coordinates to check (2,1) to see if it's a bomb. If it IS, it would increment the counter in the stack iteration for (3,1) and move to (4,1) to check to see if it's a bomb. Once all the squares surrounding (3,1) have been checked and all the bombs surrounding it accounted for, we can return a value to the stack iteration for (4,2) and move on to (5,2) which is directly above the black dot and start the whole process over again.

Yes, it's more complex than that, really. A lot of head-scratching went into programming MineSweeper, simple game though it is. It still makes for a good example of how Recursive Functions work and what they can be used for besides finding factorials.

There is always a need for learning new tricks, and with the Internet and the Web, there is never a dirth of new information.  CSS3 has been around awhile, but since not all browsers support the features yet, it has become a hit-and-miss proposition as to whether the new tricks will work.  This makes it supremely difficult for developers whose project managers or clients want the new features, but also demand backwards compatibility. At some point you just want to throw up your hands in frustration and say, "Get a new browser!!!" 

Unfortunately, although CSS3 adds a significant number of new features, it is still under development by the W3C, which means not all browsers support all the features, and some (most notably Microsoft IE6) support none of them.  To get the new CSS3 features in all their glory, you'll need to upgrade your browser to the newest version of whatever browser you're using, and if you're a Microsuck... er, Microsoft fan, you may just have to do without. 

A quick test for Firefox users:  if the following paragraph has a gradient border, your Firefox browser supports CSS3.  If not, you're due for an upgrade!  As of this writing, Chrome, Safari, Opera, and of course Microsuck... er, Microsoft do not support the border-colors (plural) feature.

This box should have a gently fading gray border on updated Mozilla Firefox browsers

Some of the most significant features of CSS3 are as follows:

  • Selectors
  • Box Model
  • Backgrounds and Borders
  • Text Effects
  • 2D/3D Transformations
  • Animations
  • Multiple Column Layout
  • User Interface

To learn more about CSS3 and how to implement it in your web design projects, visit

For a really interesting treatise on how to use CSS3 in lieu of JQuery for a cool slide-out panel, see this tutorial:

It is not uncommon for more than one MS Access database to be used in a single workplace. I have several that I use in my own business as an Access and Web developer. When I develop a new database, I hate re-writing or even copying and pasting all the simple functions that I use all the time - functions I have written to make my life easier such as Replicate(), VBIn(), VBBetween() and ErrMsg() that I use in nearly every database I create. It becomes even more irritating to copy and paste the not-so-simple ones that require importing entire modules of code, API declarations, and global variables. What I have done instead is create a database with all these functions already in it, then make a reference to it using the Tools==>References dialog in the VBA Project window. I just click the Browse… button and navigate to the location where I have my Functions.accdb database and click OK. Done! All my functions are now ready to use in my new database. A tip for when your database won’t compile is to check those references. Especially when you use Office automation (integration with Word or Outlook), references to functions in those project libraries can be useful, but links can also get confused – especially if you move your application to another computer. Open the dialog and look for any x’s next to your available references. If your application breaks when moving to a different computer, the referenced library may be in a different location. For example, if you moved from a system with a 32-bit Office installation to another with a 64-bit Office installation, the files would not be properly referenced.