Sunday, February 24, 2013

On sitting down with a new stack of books

The danger of reading programming books is that you may well learn you have been diligently doing the wrong things.

That can sting.  But the danger of NOT reading programming books is that you might never find that out.

Embrace the buzzsaw.  Keep reading. 

Saturday, February 09, 2013

Useful Things to Know, #429: Recursive Anonymous Functions

If you’ve ever tried to code an anonymous function that calls itself, you may have concluded that it can’t be done.  After all, trying the following …

 Func<int, int> collatz = (n) =>
{
if (n == 1)
return 0;
if (n % 2 == 0)
return collatz(n/2) + 1;
else
return collatz(3 * n + 1) + 1;
};

… leads to the message:  “Error:  Use of unassigned local variable ‘collatz’”.

And this makes sense:  the delegate “collatz” doesn’t have a value until after the execution of the assignment statement in which you’re referencing it!

But the error message contains the key to making it work.  The message says that “collatz” is unassigned.  So in order to use it in an expression, assign it an initial value before assigning it your recursive anonymous function.

Func<int, int> collatz = null;
collatz = (n) =>
{
if (n == 1)
return 0;
if (n % 2 == 0)
return collatz(n/2) + 1;
else
return collatz(3 * n + 1) + 1;
};

(If you’re wondering what problem that function could possibly solve, check here.)

Labels: