I know how to fix this!
bool IsEven(int number) { bool even = true; for (int i = 0; i < number; ++i) { if (even == true) { even = false; } else if (even == false) { even = true; } else { throw RuntimeException("Could not determine whether even is true or false."); } } if (even == true) { return even ? true : false; } else if (even == false) { return (!even) ? false : true; } else { throw RuntimeException("Could not determine whether even is true or false."); } }Have you tried seeing if the recursive approach runs faster?
I know an even better way. We can make it run in O(1) by using a lookup table. We only need to store 2^64 booleans in an array first.
My solution in perl back in the day when I was a teenage hobbyist who didn’t know about the modulus operator: Divide by 2 and use regex to check for a decimal point.
if ($num / 2 =~ /\./) { return “odd” }
else { return “even” }Divide by 2 and check for a decimal point.
I mean, it ain’t wrong.
You know, I was going to let this slide under the notion that we’re just ignoring the limited precision of floating point numbers… But then I thought about it and it’s probably not right even if you were computing with real numbers! The decimal representation of real numbers isn’t unique, so this could tell me that “2 = 1.9999…” is odd. Maybe your string coercion is guaranteed to return the finite decimal representation, but I think that would be undecidable.
Ackchyually-- IEEE 754 guarantees any integer with absolute value less than 2^24 to be exactly representable as a single precision float. So, the “divide by 2, check for decimals” should be safe as long as the origin of the number being checked is somewhat reasonable.
You could do this in one line…
By removing all the linebreaks.
def is_even(n): match n: case 1: return False case 0: return True # fix No1 case n < 0: return is_even(-1*n) case _: return is_even(n-2)

