more useful options PerlMonks

### Re: Zeckendorf representation

by jwkrahn (Abbot)
 on Aug 25, 2012 at 02:58 UTC Need Help??

```sub is_fibonnacci {
my \$plus = (5 * \$_[0] * \$_[0]) + 4;
my \$mins = (5 * \$_[0] * \$_[0]) - 4;
return is_perfect_square(\$plus) | is_perfect_square(\$mins);
}

No need to calculate 5 * \$_[0] * \$_[0] twice, and you probably meant to use the logical or operator instead of the bit-wise or operator.

```sub is_fibonnacci {
my \$plus = (5 * \$_[0] * \$_[0]) + 4;
my \$mins = \$plus - 8;
return is_perfect_square(\$plus) || is_perfect_square(\$mins);
}

(The logical operators short-circuit so is_perfect_square(\$mins) will only execute if is_perfect_square(\$plus) is true.)

```sub is_perfect_square {
my \$sqrt = int(sqrt(\$_[0]));
return \$sqrt * \$sqrt == \$_[0];
}

Or just:

```sub is_perfect_square { int( \$_[0] ** .5 ) ** 2 == \$_[0] }

Replies are listed 'Best First'.
Re^2: Zeckendorf representation
by thmsdrew (Scribe) on Aug 25, 2012 at 03:11 UTC

Thanks for your input! What do you mean by "short circuit"? Also, the difference between your is_perfect_square sub and mine is that mine is much more clear. I can afford the extra line for a bit of clarity.

What do you mean by "short circuit"?
It means that the part after || will only be evaluated if it is needed know the result of the operator. In the case of the or-operator the second half is redundant if the first is true, since the total will be true no matter what the second part is.

I don't really understand how that is a problem. If the first part passes, then I want it to return true, and I truly don't care what the second part is. I guess I see how that's redundant, though.

Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://989681]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (7)
As of 2024-02-27 10:57 GMT
Voting Booth?
My favourite way to spend a leap day ...

Results (26 votes). Check out past polls.